Отсутствует оболочка в XML - PullRequest
       1

Отсутствует оболочка в XML

0 голосов
/ 19 сентября 2019

Я пытаюсь получить определенные данные из одного большого XML в другой.Мой основной XML-файл выглядит следующим образом:

<MAIN>
<transaction>
        <date>20190415</date>
        <ticket>1</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>2</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>3</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>4</ticket>
        <value>15</value>
</transaction>
<transaction>
        <date>20190415</date>
        <ticket>5</ticket>
        <value>15</value>
</transaction>
</MAIN>

Я извлекаю только значения <ticket> и добавляю его в новый / новый XML-файл.

Ниже мой код

import pandas as pd
import xml.etree.ElementTree as ET
from lxml import etree

path_source = 'source\path'
path_dest =  'dest\path'

tree = ET.parse(path_source)
root = tree.getroot()

L_roots = []

for trx in root.iter('transaction'):
    ticket = trx.find('ticket').text

    root_T = ET.Element('MAIN')
    doc = ET.SubElement(root_T, 'Transaction')

    ET.SubElement(doc, 'ticket').text = ticket

    L_roots.append(doc)

with open(path_dest,'wb') as f:
    for i in L_roots:
        ET.Element('MAIN')
        f.write(ET.tostring(i, method="xml"))

я получаю простой текстовый файл без внешних тегов <MAIN>.как показано ниже

<Transaction>
    <ticket>1</ticket>
</Transaction>
<Transaction>
    <ticket>2</ticket>
</Transaction>
<Transaction>
    <ticket>3</ticket>
</Transaction>
<Transaction>
    <ticket>4</ticket>
</Transaction>
<Transaction>
    <ticket>5</ticket>
</Transaction>

Чего здесь не хватает, так это тегов оболочки <MAIN>.что нужно изменить в моем коде, чтобы добиться этого?

1 Ответ

1 голос
/ 19 сентября 2019

Замените это:

with open(path_dest,'wb') as f:
    for i in L_roots:
        ET.Element('MAIN')
        f.write(ET.tostring(i, method="xml"))

на это:

outroot = ET.Element('MAIN')
outroot.extend(L_roots)

with open(path_dest,'wb') as f:
    f.write(ET.tostring(outroot, method="xml"))

Ошибка в вашем фрагменте состоит в том, что вы никогда не сохраняете новый ET.Element('MAIN') в переменную, поэтому он теряется,При использовании f.write вы просто пишете элементы в L_roots, которые имеют тег Transaction.

В предлагаемом мной фрагменте все элементы L_roots вставляются в другой элемент MAIN, а затемзаписан основной элемент (все его подэлементы записываются автоматически).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...