Python XML разбор с минидом

У меня есть этот файл XML, и мне нужно прочитать значение из синхронизации и события в том же порядке, что и в файле XML.

<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

Есть ли решение? Спасибо.

3 ответа

Если вы настаиваете на использовании минидома:

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

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

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())

Если вы каким-то образом не ограничены использованием Minidom, попробуйте использовать ElementTree, как предложил Martijn. Исходя из моего личного опыта, это намного проще в использовании. Вы можете найти документацию здесь

Для вашей проблемы вы можете попробовать что-то вроде этого:

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 является картой для всех атрибутов тега.

Другие вопросы по тегам