为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2022-06-22 18:23:20
使用 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不能,请推荐另一种方式。
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果我对您的理解正确,那么到达那里的方式有点奇怪,并且至少可以与上面的精简 xml 一起使用-因此,如果它符合您的需要,它可能就足够了...


myx = """[your xml snippet]"""

from bs4 import BeautifulSoup as bs

soup = bs(myx,'html.parser') #yup, html parser...

for i in soup:           

    if 'ENTITY' in i and 'SYSTEM' in i:

        one = i.split('SYSTEM')

        two = one[1].split('NDATA')

        print(two[0])

输出:


somegraphic1.cgm


somegraphic2.cgm


查看完整回答
反对 回复 2022-06-22
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

libxml2 有一个函数xmlGetDocEntity(doc, name),它返回一个表示实体的对象,其中一个字段URI包含未解析的实体 URI。这就是我用于执行类似操作的工具的工具:https ://github.com/kibook/s1kd-tools/tree/master/tools/s1kd-refs 。


示例用法:


$ s1kd-refs --icn DMC-[...].XML

somegraphic1.cgm

somegraphic2.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">


    <xsl:template match="/">

      <graphics>

        <xsl:apply-templates select="//@infoEntityIdent"/>

      </graphics>

    </xsl:template>


    <xsl:template match="@infoEntityIdent">

      <graphic>

        <xsl:value-of select="unparsed-entity-uri(.)"/>

      </graphic>

    </xsl:template>


</xsl:transform>

输出:


<graphics>

  <graphic>somegraphic1.cgm</graphic>

  <graphic>somegraphic2.cgm</graphic>

</graphics>


查看完整回答
反对 回复 2022-06-22
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信