猿问

获取 xml 文件 doctype 中的实体列表

使用 python 和 lxml,有没有办法在 xml 文件的 doctype 中获取实体列表?这是缩小的xml:


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE dmodule [

<!ENTITY somegraphic1 SYSTEM 'somegraphic1.cgm' NDATA cgm>

<!ENTITY somegraphic2 SYSTEM 'somegraphic2.cgm' NDATA cgm>

<!NOTATION cgm SYSTEM 'cgm'>

<!ENTITY % ISOEntities PUBLIC 'ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML' 'http://www.s1000d.org/S1000D_4-1/ent/xml/ISOEntities'>

%ISOEntities;]>

<dmodule>

<graphic ident="somegraphic1"/>

<graphic ident="somegraphic2"/>

</dmodule>

我可以使用 lxml 解析文件并检索 doctype 中列出的实体 (!ENTITY) 吗?我想要最终结果为 ['somegraphic1.cgm', 'somegraphic2.cgm'] 的图形文件列表。目前,代码(不优雅)只是打开 xml 文件并逐行读取,直到<dmodule然后拆分寻找以“.cgm”结尾的字符串的行 - 呸。如果lxml不能,请推荐另一种方式。


牧羊人nacy
浏览 189回答 2
2回答

qq_花开花谢_0

如果我对您的理解正确,那么到达那里的方式有点奇怪,并且至少可以与上面的精简 xml 一起使用-因此,如果它符合您的需要,它可能就足够了...myx = """[your xml snippet]"""from bs4 import BeautifulSoup as bssoup = bs(myx,'html.parser') #yup, html parser...for i in soup:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; if 'ENTITY' in i and 'SYSTEM' in i:&nbsp; &nbsp; &nbsp; &nbsp; one = i.split('SYSTEM')&nbsp; &nbsp; &nbsp; &nbsp; two = one[1].split('NDATA')&nbsp; &nbsp; &nbsp; &nbsp; print(two[0])输出:somegraphic1.cgmsomegraphic2.cgm

慕的地8271018

libxml2 有一个函数xmlGetDocEntity(doc, name),它返回一个表示实体的对象,其中一个字段URI包含未解析的实体 URI。这就是我用于执行类似操作的工具的工具:https ://github.com/kibook/s1kd-tools/tree/master/tools/s1kd-refs 。示例用法:$ s1kd-refs --icn DMC-[...].XMLsomegraphic1.cgmsomegraphic2.cgm我使用“//@infoEntityIdent”之类的 XPath 表达式来获取所有使用的图形的列表,然后获取每个图形的实体 URI。请注意,这并未列出 DTD 中声明的所有 ENTITY,仅列出了在 XML 中实际用作<graphic>s 或<symbol>s 的那些。lxml 建立在 libxml2 之上,但我对它不够熟悉,不知道是否有与 xmlGetDocEntity 完全等价的东西。另一种选择是首先使用 XSLT 创建更易于解析的内容:<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">&nbsp; &nbsp; <xsl:template match="/">&nbsp; &nbsp; &nbsp; <graphics>&nbsp; &nbsp; &nbsp; &nbsp; <xsl:apply-templates select="//@infoEntityIdent"/>&nbsp; &nbsp; &nbsp; </graphics>&nbsp; &nbsp; </xsl:template>&nbsp; &nbsp; <xsl:template match="@infoEntityIdent">&nbsp; &nbsp; &nbsp; <graphic>&nbsp; &nbsp; &nbsp; &nbsp; <xsl:value-of select="unparsed-entity-uri(.)"/>&nbsp; &nbsp; &nbsp; </graphic>&nbsp; &nbsp; </xsl:template></xsl:transform>输出:<graphics>&nbsp; <graphic>somegraphic1.cgm</graphic>&nbsp; <graphic>somegraphic2.cgm</graphic></graphics>
随时随地看视频慕课网APP

相关分类

Python
我要回答