#python #python-3.x
#python #python-3.x
Вопрос:
Я пытаюсь проанализировать XML-файл.
Мне удалось проанализировать теги на верхнем уровне, но теперь у меня есть тег внутри тега, и я не получаю правильный вывод.
XML-ФАЙЛ:
<?xml version="1.0" encoding="UTF-8"?>
<Stations>
<Station>
<Code>HT</Code>
<Type>knooppuntIntercitystation</Type>
<Namen>
<Kort>Den Bosch</Kort>
<Middel>'s-Hertogenbosch</Middel>
<Lang>'s-Hertogenbosch</Lang>
</Namen>
<Land>NL</Land>
<Synoniemen>
<Synoniem>Hertogenbosch ('s)</Synoniem>
<Synoniem>Den Bosch</Synoniem>
</Synoniemen>
</Station>
<Station>
<Code>ALMO</Code>
<Type>stoptreinstation</Type>
<Namen>
<Kort>Oostvaard</Kort>
<Middel>Oostvaarders</Middel>
<Lang>Almere Oostvaarders</Lang>
</Namen>
<Land>NL</Land>
<Synoniemen>
</Synoniemen>
</Station>
<Station>
<Code>ATN</Code>
<Type>stoptreinstation</Type>
<Namen>
<Kort>Aalten</Kort>
<Middel>Aalten</Middel>
<Lang>Aalten</Lang>
</Namen>
<Land>NL</Land>
<Synoniemen>
</Synoniemen>
</Station>
<Station>
<Code>ASA</Code>
<Type>intercitystation</Type>
<Namen>
<Kort>Amstel</Kort>
<Middel>Amsterdam Amstel</Middel>
<Lang>Amsterdam Amstel</Lang>
</Namen>
<Land>NL</Land>
<Synoniemen>
</Synoniemen>
</Station>
</Stations>
Моя функция python:
import xml.etree.ElementTree
e = xml.etree.ElementTree.parse('info.xml').getroot()
for stationsnamens in e.findall('Station'):
try:
syn = stationsnamens.find('Synoniemen/Synoniem').text
print(syn)
except:
print(Exception)
Я пытаюсь напечатать все Synoniemen
имеющиеся поля, но только если они существуют. Кроме того, «Код» должен быть напечатан.
Формат вывода:
{Code}: {Synoniemen}
Комментарии:
1. Я прочитал это, но в нем говорится только о том, как работать с верхним слоем. Я не могу узнать, как я могу перейти на Station / Synoniemen / Synoniem. Если бы это был просто синоним, например, я знаю, как это сделать.
Ответ №1:
что-то вроде этого (примечание: я использовал .fromstring()
в этом примере, но вы можете изменить это для собственного использования с файлами)
import xml.etree.ElementTree
xmlstring = "<root><synoniemen><synoniem>A</synoniem><synoniem>B</synoniem></synoniemen></root>"
e = xml.etree.ElementTree.fromstring(xmlstring)
syn = e.find('synoniemen')
for synoniem in syn:
print(synoniem.text)
дело в том, что syn
это итеративно с a for
, поскольку оно содержит несколько элементов.
Итак, ваш код будет выглядеть примерно так:
for stationsnamens in e.findall('Station'):
code = stationsnames.find('Code')
try:
syn = stationsnamens.find('Synoniemen')
for synoniem in syn:
print(code.text, synoniem.text)
except:
print(Exception)
Комментарии:
1. Ошибка типа: объект ‘NoneType’ не является итеративным, вот что я получаю
2. вы перешли с
syn = stationsnamens.find('Synoniemen/Synoniem').text
наsyn = stationsnamens.find('Synoniemen')
??3. Спасибо, это идеально. Вы также знаете, как я могу добавить <Code> перед синонимом?
4. @SomeName, обновленный ответ с «Кодом»… если вы хотите большего, я советую вам «поиграть с этим»… это то, что я сделал, когда узнал об этом (не так давно)… удачи 🙂