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