【问题标题】:Expand default (dita) attributes展开默认 (dita) 属性
【发布时间】:2016-01-20 08:10:27
【问题描述】:

我的 python libxml2 以不同方式处理具有默认属性的文件,具体取决于我想知道什么。示例,使用 DITA DTD(包可以在 www.dita-ot.org 下载):

import libxml2
import libxsltmod

s = """<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v1
_2/dtd/technicalContent/dtd/map.dtd">

<map title="Empty map">
</map>"""

libxml2.substituteEntitiesDefault(1)
xmldoc = libxml2.parseDoc(s)
print xmldoc

输出如你所愿:

<?xml version="1.0"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v1
_2/dtd/technicalContent/dtd/map.dtd">
<map xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/"
  title="Empty map" ditaarch:DITAArchVersion="1.2" domains="(topic delay-d)
  (map mapgroup-d)                           (topic indexing-d)
  (map glossref-d)                          (topic hi-d)
  (topic ut-d)                           (topic hazard-d)
  (topic abbrev-d)                          (topic pr-d)
  (topic sw-d)                          (topic ui-d)
  " class="- map/map ">
</map>

但是如果我注释掉import libxsltmod,结果是:

<?xml version="1.0"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD XDITA Map//EN"
"file://.../dita-ot-2.2.1/plugins/org.oasis-open.dita.v
1_2/dtd/technicalContent/dtd/map.dtd">
<map title="Empty map">
</map>

所以,libxsltmod 做了一些东西来激活默认属性扩展。请您建议什么,以及如何通过 python 激活此功能?

【问题讨论】:

    标签: python libxml2 dita


    【解决方案1】:

    我不知道 libxsltmod 是如何全局启用此设置的,但通常情况下,DTD 默认属性是使用parser option XML_PARSE_DTDATTR 添加的。使用readDoc 而不是parseDoc 来提供解析器选项:

    xmldoc = libxml2.readDoc(s, None, None, libxml2.XML_PARSE_DTDATTR)
    

    或者,如果您还想替换实体:

    flags = libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR
    xmldoc = libxml2.readDoc(s, None, None, flags)
    

    【讨论】:

    • 感谢您指向readDoc 函数。但是,请更正您的答案,标志应为libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR
    【解决方案2】:

    我已接受 @nwellnhof 的回答,但也想发表我的调查。

    libxslt模块的初始化函数initlibxsltmod设置全局变量:

    xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
    

    我没有发现从libxml2 Python/C 绑定代码中访问这个变量的任何可能性,但是我发现这个变量是用来初始化一个默认的“解析器上下文”的,并且可以创建和使用手动解析器上下文:

    ctxt = libxml2.createDocParserCtxt(s)
    opts = libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR
    ctxt.ctxtUseOptions(opts)
    ctxt.parseDocument()
    xmldoc = ctxt.doc()
    del ctxt
    

    Python/C 函数readDoc 正是以这种方式执行的(创建上下文、设置选项、解析)。手动创建上下文很冗长,但在某些情况下可能是必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-17
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2021-03-31
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多