Синтаксический анализ XML в Python с несколькими тегами

#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, обновленный ответ с «Кодом»… если вы хотите большего, я советую вам «поиграть с этим»… это то, что я сделал, когда узнал об этом (не так давно)… удачи 🙂