2016-01-20 104 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執行這樣(創建上下文,設置選項,解析)。手動上下文創建是冗長的,但在某些情況下可能是必需的。