2016-01-20 46 views
1

我的python libxml2根据我想要知道的内容,使用默认属性以不同方式处理文件。的例子中,使用DITA DTD(可以在包上www.dita-ot.org下载):作为期望展开默认(dita)属性

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激活此功能?

回答

2

我不知道libxsltmod如何使全球此设置,但通常情况下,DTD默认属性与parser optionXML_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) 
+0

感谢您指向'readDoc'函数。但是,请更正您的答案,标记应该是'libxml2.XML_PARSE_NOENT | libxml2.XML_PARSE_DTDATTR' – olpa

1

我已经接受了来自@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 exacly执行这样(创建上下文,设置选项,解析)。手动上下文创建是冗长的,但在某些情况下可能是必需的。