Разобрать XML файл с пространством имен с Python - PullRequest
1 голос
/ 02 мая 2020

У меня есть комплекс xml Я пытаюсь извлечь данные из.

<?xml version="1.0" ?>
<root xmlns="something.something.com">
    <Save>
        <AdditionalInfo>
            <Name></Name>
            <Time></Time>
            <UtilityVersion></UtilityVersion>
            <XMLVersion></XMLVersion>
            <PluginName></PluginName>
            <ClassName></ClassName>
        </AdditionalInfo>
        <Data>
            <session>
                <xyDataObjects>
                    <xyData Key="'info'" ObjectType="moreinfo" Type="evenmoreinfo">
                        <axis1QuantityType ObjectType="guesswhat" Type="info!">
                            <label></label>
                            <type></type>
                        </axis1QuantityType>
    ... and so on and so on

Файл имеет несколько блоков, начинающихся и заканчивающихся блоками Сохранить и / Сохранить, и информация, которую я ищу, может быть как вплоть до метки, так и даже дальше.

ElementTree.Iter, казалось, был моим решением, так как он будет проходить через каждый блок Save и находить информацию <label>, которую я ищу, но, к сожалению, он не принимает аргумент пространства имен.

Какие другие мои опции? Я пытаюсь сохранить свой код гибким, так как предвижу, что структура файла xml может измениться в будущем, и будет простым, поэтому я бы не стал реализовывать что-то вроде:

tree= ET.parse('dblank.xml')
root = tree.getroot()
for i in range(len(root)):
        Array[i]=root[i][1][0][0][0][0][0].text

1 Ответ

2 голосов
/ 03 мая 2020

Когда вы обрабатываете XML с пространствами имен, вы должны указать используемые пространства имен. Для этого я:

  • определил ns переменную (словарь) с ярлыками пространства имен в качестве ключей и полными пространствами имен в качестве значений (одна запись словаря здесь),
  • использовал эту переменную в качестве второго аргумента в findall .

Также обратите внимание, что первый аргумент findall содержит some: as начальная часть имени элемента.

Попробуйте следующий код:

import xml.etree.ElementTree as et

tree = et.parse('Input.xml')
root = tree.getroot()
ns = {'some': 'something.something.com'}

for elem in root.findall('.//some:label', ns):
    print(elem.text)

Конечно, это только пример того, как ссылаться на существующий элемент. Измените его в соответствии с вашими потребностями.

...