2010-05-23 205 views
1

我有一個使用xml.dom.minidom創建的節點xml.dom.Node對象的集合。我將它們(單獨)存儲在數據庫中,方法是使用Node對象的toxml()方法將它們轉換爲字符串。如何在python中解析表示xml.dom.minidom節點的字符串?

問題是,我有時希望能夠使用某種解析器將它們轉換回適當的Node對象。據我可以看到python使用的各種庫使用Expat,它不會解析字符串,如''或任何不是正確的xml字符串。

那麼,有沒有人有任何想法?我意識到我可以通過某種方式來醃製節點,然後取下它們,但這會讓人覺得不愉快,我寧願將它們存儲在一個可以用於維護目的的表單中。當然有什麼會做到這一點?

爲響應表示懷疑,這是可能的,我的意思的例子:

>>> import xml.dom.minidom 
>>> x=xml.dom.minidom.parseString('<a>foo<b>thing</b></a>') 
>>> x.documentElement.childNodes[0] 
<DOM Text node "u'foo'"> 
>>> x.documentElement.childNodes[0].toxml() 
u'foo' 
>>> xml.dom.minidom.parseString(x.documentElement.childNodes[0].toxml()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py", line 1928, in parseString 
    return expatbuilder.parseString(string) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 940, in parseString 
return builder.parseString(string) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 223, in parseString 
parser.Parse(string, True) 
xml.parsers.expat.ExpatError: syntax error: line 1, column 0 

換句話說,「.toxml()」方法不創造一些外籍人士(並因此出的框parseString)將解析。

我想要的是將u'foo'解析爲文本節點。即這將扭轉.toxml()的效果

+0

我沒有看到如何toxml用於'調用()'可能會產生不正確的XML片段......從而通過toxml用於'生成的所有字符串()'應該是由'解析可解析()'或'parseString( )'xml.dom.minidom'的函數... – 2010-05-23 12:06:22

+0

謝謝你的例子。事實上,文本節點呈現爲純文本,這不是有效的xml。 – 2010-05-25 04:59:08

回答

2

您需要存儲哪些類型的節點?

顯然,如果元素節點與.toxml('utf-8')序列化,應該只是工作;結果應該可以解析爲一個XML文檔,並且可以從documentElement中檢索該元素,只要其中沒有需要在doctype中定義的EntityReferences。

另一方面,文本節點需要HTML解碼或一些包裝來解析。如果你只需要元素和文本節點,你可以猜測它是否是從第一個字符的元素,因爲這必須始終<一個元素:

var xml= node.toxml('utf-8') 

... 

if (xml.startswith('<')): 
    node= minidom.parseString(xml).documentElement 
else: 
    node= minidom.parseString('<x>%s</x>'%xml).documentElement.firstChild 

Comment節點同樣可以通過檢查<!--存儲。

像Attr這樣的其他節點類型可能會有更多的工作,因爲它們的XML表示不容易與Text區分開來。您可能需要存儲帶外nodeType值才能記住它。 OTOH minidom不會在Attr上實現toxml(),所以也許這不是問題。

+0

它存儲的數據被刮掉了,所以我試圖保守我所做的任何假設,但是你可能是正確的,它只能是我必須擔心的元素和文本節點。 Attr不會是一個問題,但它可能會有一些評論。如果只有一個可以接受字符串的簡單解析器,但是存儲該類型的帶外註釋可能已經足夠了,那將會很整潔。只是數據庫中的另一列。謝謝。 – 2010-05-23 16:16:29

3
from xml.dom.minidom import parseString 

try: 
    node = parseString('') 
except Exception: 
    node = None