2010-08-17 66 views
3

我想問一下已知的現有Python 2.x庫是否用於解析帶有內置DTD的XML文檔而不是自動擴展實體。 (對於那些好奇的文件:JMdict。)Python:解析XML文檔,同時保留實體

看來lxml有一些不解析實體的選項,但最後我試過了,實體剛剛被轉換爲空白。我只是搜索了這個,發現pxdom是我可能嘗試的另一種選擇,但由於它是純Python,它似乎比我想要的慢得多。

還有什麼呢?

+0

我想'xml.parsers.expat.XML_PARAM_ENTITY_PARSING_NEVER'的外籍人士會做到這一點,但它沒有任何效果。我想知道什麼是好事。 – boiko 2013-02-20 12:58:01

回答

1

看起來用例相當不正常;不擴展實體似乎違背瞭解析器通常應該按照XML規範工作的方式。

所以,我認爲這可能是最容易的。我已經通過re.finditer手動提取標籤,並創建了映射的字典。從這裏開始,它只是掃描分析後的輸出併爲我的應用程序做正確的事情。我覺得我的用例足夠好。

1

首先,BeautifulStoneSoupBeautifulSoup默認情況下不會擴展實體。

儘管您的用例可能不會很快或很高效,因爲它適用於不同類型的用法(處理各種形式不良和破碎的標記)。

+0

雖然知道這很高興。謝謝。 – Vultaire 2010-08-22 05:41:55

2

lxml在問題中提到,它根據我的意思做了你想要的。測試代碼:

from lxml import etree 

XML = """ 
<!DOCTYPE root [ 
<!ENTITY abc "123"> 
]> 
<root> 
&abc; 
</root>""" 

parser = etree.XMLParser(resolve_entities=False) 

root = etree.fromstring(XML, parser) 
print "Entity not resolved:" 
print etree.tostring(root) 
print 

print "Entity resolved:" 
root = etree.fromstring(XML) 
print etree.tostring(root) 

輸出:

Entity not resolved: 
<root> 
&abc; 
</root> 

Entity resolved: 
<root> 
123 
</root> 
+0

我真的想用expat來解決這個問題,以避免依賴和重寫我的當前代碼。但是,是的,這確實解決了這個問題。 – boiko 2013-02-21 01:15:38