【问题标题】:Using an XML catalog with Python's lxml?将 XML 目录与 Python 的 lxml 一起使用?
【发布时间】:2010-09-05 23:17:02
【问题描述】:

当我使用 lxml 解析 XML 文档时,有没有办法使用外部目录文件根据其 DTD 验证该文档?我需要能够处理文档 DTD 中定义的固定属性。

【问题讨论】:

    标签: python xml lxml


    【解决方案1】:

    您可以将目录添加到XML_CATALOG_FILES 环境变量中:

    os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
    

    this thread。请注意,XML_CATALOG_FILES 中的条目是以空格分隔的 URL。您可以使用 Python 的 pathname2urlurljoin(与 file:)从路径名生成 URL。

    【讨论】:

      【解决方案2】:

      lxml 似乎没有公开这个 libxml2 功能,grepping 源代码只会出现一些#defines 用于错误处理:

      C:\Dev>grep -ir --include=*.px[id] catalog lxml-2.1.1/src | sed -r "s/\s+/ /g"
      lxml-2.1.1/src/lxml/dtd.pxi: catalog.
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_FROM_CATALOG = 20 # The Catalog module
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_WAR_CATALOG_PI = 93 # 93
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_MISSING_ATTR = 1650
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_ENTRY_BROKEN = 1651 # 1651
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_PREFER_VALUE = 1652 # 1652
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_NOT_CATALOG = 1653 # 1653
      lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_RECURSION = 1654 # 1654
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG=20
      lxml-2.1.1/src/lxml/xmlerror.pxi:WAR_CATALOG_PI=93
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_MISSING_ATTR=1650
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_ENTRY_BROKEN=1651
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_PREFER_VALUE=1652
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_NOT_CATALOG=1653
      lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_RECURSION=1654
      

      catalog implementation in libxml2 page 看来,通过安装在 /etc/xml/catalog 中的“透明”处理似乎仍然可以在 lxml 中工作,但如果您需要更多,您可以随时放弃 lxml 并使用默认的 python 绑定,它确实公开了目录功能。

      【讨论】:

        【解决方案3】:

        你能举个例子吗?根据lxml validation docs,lxml 可以处理 DTD 验证(在 XML 文档中指定或在外部代码中指定)和系统目录,这涵盖了我能想到的大多数情况。

        f = StringIO("<!ELEMENT b EMPTY>")
        dtd = etree.DTD(f)
        dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
        

        【讨论】:

          猜你喜欢
          • 2019-11-19
          • 2011-03-05
          • 2013-06-19
          • 1970-01-01
          • 1970-01-01
          • 2020-03-14
          • 2020-09-08
          • 2019-11-17
          • 1970-01-01
          相关资源
          最近更新 更多