2014-01-27 118 views
1

我有這個XML文件 ,我需要按照與XML文件中相同的順序讀取Sync和Event中的值。python xml用minidom解析

<Episode> 
<Section type="report" startTime="0" endTime="263.035"> 
    <Turn startTime="0" endTime="4.844" speaker="spk1"> 
     <Sync time="0"/> 
     aaaaa 
    </Turn> 
    <Turn speaker="spk2" startTime="4.844" endTime="15.531"> 
     <Sync time="4.844"/> 
     bbbbb 
     <Event desc="poz" type="noise" extent="begin"/> 
     ccccc 
     <Event desc="poz" type="noise" extent="end"/> 
     ddddd 

    <Sync time="12.210"/> 
     eeeee 
    </Turn> 
    <Turn speaker="spk1" startTime="15.531" endTime="17.549"> 
     <Event desc="poz" type="noise" extent="begin"/> 
     fffff 
    </Turn> 
</Section> 
</Episode> 

我需要這樣的輸出:

aaaaa 
bbbbb 
ccccc 
ddddd 
eeeee 
fffff 

有沒有什麼解決辦法嗎?謝謝。

+0

你爲什麼要使用minidom命名? [documentation](http://docs.python.org/2/library/xml.dom.minidom.html#module-xml.dom.minidom)警告不要使用它(DOM是冗長和古老的方式),建議您改用[ElementTree API](http://docs.python.org/2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree)。 –

回答

0

使用內置SAX解析器:

from xml import sax 

class EpisodeContentHandler(sax.ContentHandler): 
    def characters(self, content): 
     content = content.strip() 
     if content: 
      print content 

with open("Episode.xml") as f: 
    sax.parse(f, EpisodeContentHandler()) 
0

除非你以某種方式限於使用minidom命名,請嘗試使用 'ElementTree的' 作爲建議的Martijn。從我個人的經驗來看,使用起來要容易得多。你可以找到它的文檔here

對於你的問題,你可以嘗試這樣的事:

import xml.etree.ElementTree as ET 

# Get the tree structure of the XML 
tree = ET.parse("data.xml") 
# Get the root/first tag in the tree 
root = tree.getroot() 
# Ge all elements with interesting tags 
for child in root.findall("Sync"): 
    print child.text 

旁註:child.attrib是一個映射到所有標籤的屬性。

+0

謝謝,但是這段代碼不起作用。有沒有辦法用minidom來做到這一點?或者我必須使用ElementTree ... – user3240368

0

如果你堅持使用minidom命名上:

elements = minidom.parseString(xml).getElementsByTagName('*') # where xml is your input xml 
for el in elements: 
    if el.localName == 'Sync' or el.localName == 'Event': 
     print el.nextSibling.nodeValue.strip() 

這將打印:

aaaaa 
bbbbb 
ccccc 
ddddd 
eeeee 
fffff