2014-01-27 2 views
1

У меня есть этот XML-файл , и мне нужно прочитать значение из Sync и Event в том же порядке, что и в XML-файле.python xml parse with 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? В [документации] (http://docs.python.org/2/library/xml.dom.minidom.html#module-xml.dom.minidom) предостерегает от его использования (DOM - путь к подробному и архаичному) и рекомендует вместо этого использовать API [ElementTree API] (http://docs.python.org/2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree). –

ответ

0

Используйте встроенный саксофон анализатор:

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», как предложил Мартейн. Из моего личного опыта это намного проще в использовании. Вы можете найти его документация 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 

Sidenote: child.attrib представляет собой карту для всех атрибутов тега.

+0

Спасибо, но этот код не работает. Есть ли способ сделать это с минидом? Или я должен использовать 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