展开默认 (dita) 属性
Expand default (dita) attributes
我的 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 激活此功能?
我不知道 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)
我已经接受了@nwellnhof 的回答,但也想发表我的调查。
libxslt
模块的初始化函数initlibxsltmod
设置全局变量:
xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
我还没有发现任何从 libxml2
Python/C 绑定代码访问这个变量的可能性,但我发现这个变量用于初始化一个默认值 'parser context',并且可以手动创建和使用解析器上下文:
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
正是以这种方式执行的(创建上下文、设置选项、解析)。手动创建上下文很冗长,但在某些情况下可能是必要的。
我的 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 激活此功能?
我不知道 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)
我已经接受了@nwellnhof 的回答,但也想发表我的调查。
libxslt
模块的初始化函数initlibxsltmod
设置全局变量:
xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
我还没有发现任何从 libxml2
Python/C 绑定代码访问这个变量的可能性,但我发现这个变量用于初始化一个默认值 'parser context',并且可以手动创建和使用解析器上下文:
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
正是以这种方式执行的(创建上下文、设置选项、解析)。手动创建上下文很冗长,但在某些情况下可能是必要的。