Преобразование XML в Pandas Dataframe - PullRequest
0 голосов
/ 27 августа 2018

XML-файл:

<start>
    <Hit>
         <hits path="xxxxx" id="xx" title="xxx">
         <hits path="aaaaa" id="aa" title="aaa">
    </Hit>
    <Hit>
         <hits path="bbbbb" id="bb" title="bbb">
    </Hit>
    <Hit>
         <hits path="qqqqq" id="qq" title="qqq">
         <hits path="wwwww" id="ww" title="www">
         <hits path="ttttt" id="tt" title="ttt">
    </Hit>
</start>

Код Python:

import xml.etree.cElementTree as et
tree = et.parse(xml_data)
root = tree.getroot()

for child in root:
    record = child.attrib.values()
    all_records.append(record)
    pd1 = pd.DataFrame(all_records,columns=subchild.attrib.keys())

У меня неструктурированный XML-файл.Элемент Hit может иметь произвольное количество элементов hit .
Я хочу составить список всех первых попаданий подэлементов из всех Hit элементов.

Ответ:
Содержимое кадра данных:

   path    id    title
0  xxxxx   xx    xxx
1  bbbbb   bb    bbb
2  qqqqq   qq    qqq

Вот и все.Все остальные элементы должны игнорироваться.

record = child.attrib.values()

Эта строка кода принимает все значения из совпадений элемента.т.е. всего 6 значений.Я хочу только 3 значения, так как доступен только тег 3 Hit .

Как это сделать?

1 Ответ

0 голосов
/ 27 августа 2018

Я думаю, что нужно изменить:

record = child.attrib.values()

на:

record = child[0].attrib.values()

для выбора только первых значений.

Список решений для решения:

all_records = [child[0].attrib.values() for child in root ]

Если возможно, некоторые пустые Hit элементы:

all_records = []
for child in root:
    if len(child) > 0:
        record = child[0].attrib.values()
        all_records.append(record)

Решение для понимания списка:

all_records = [child[0].attrib.values() for child in root if len(child) > 0]
...