2010-03-25 71 views
0

由於XML序列如下:XML文檔被解析爲單個元素,而不是節點

<Store> 
<foo> 
<book> 
<isbn>123456</isbn> 
</book> 
<title>XYZ</title> 
<checkout>no</checkout> 
</foo> 
<bar> 
<book> 
<isbn>7890</isbn> 
</book> 
<title>XYZ2</title> 
<checkout>yes</checkout> 
</bar> 
</Store> 

我得到這個作爲我的分析xmlDoc中:

>>> from xml.dom import minidom 
>>> xmldoc = minidom.parse('bar.xml') 
>>> xmldoc.toxml() 
u'<?xml version="1.0" ?><Store>\n<foo>\n<book>\n<isbn>123456</isbn>\n</book>\n<t 
itle>XYZ</title>\n<checkout>no</checkout>\n</foo>\n<bar>\n<book>\n<isbn>7890</is 
bn>\n</book>\n<title>XYZ2</title>\n<checkout>yes</checkout>\n</bar>\n</Store>' 

有沒有一種簡單的方法預處理這個文檔,以便它在被解析時不會被解析爲一個單獨的xml元素?

+0

如果xml看起來很熟悉,那是因爲我把它從另一個StackOverflow問題中剝離出來。對原始來源道歉。 – 2010-03-25 02:08:16

+0

不確定你想要做什麼 - 是不是.toxml()調用導致它作爲文本文件輸出?我會認爲上面的輸出是你期望從.toxml()得到的。你怎麼讀一個XML然後再輸出一個XML文件馬上?你想幹什麼? – fastmultiplication 2010-03-25 02:48:20

回答

2

XML文檔始終只有一個根元素。如果你不關心根元素,只需忽略它,然後看看它的孩子!

例如,使用更現代的元素樹(但minidom命名在此方面提供了類似的可能性):

try: 
    import xml.etree.cElementTree as et 
except ImportError: 
    import xml.etree.ElementTree as et 

xmlin = '''<Store> 
<foo> 
<book> 
<isbn>123456</isbn> 
</book> 
<title>XYZ</title> 
<checkout>no</checkout> 
</foo> 
<bar> 
<book> 
<isbn>7890</isbn> 
</book> 
<title>XYZ2</title> 
<checkout>yes</checkout> 
</bar> 
</Store>''' 

root = et.fromstring(xmlin) 

for child in root.getchildren(): 
    print et.tostring(child) 
0

xmldoc是已分析的XML對象。 toxml()要求它將自己重新轉換爲XML文本字符串。進一步探索:

>>> xmldoc.childNodes 
[<DOM Element: Store at 0x212b788>] 
>>> xmldoc.childNodes[0].childNodes 
[<DOM Text node "u'\n'">, <DOM Element: foo at 0x212bcd8>, <DOM Text node "u'\n'">, <DOM Element: bar at 0x212b2d8>, <DOM Text node "u'\n'">] 

然後,認識到DOM很難處理和閱讀關於ElementTree