сплющивание xml с использованием python - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь сгладить xml и написать в csv, чтобы он мог использоваться процессом etl.

<Answers>
      <AnswersList>
        <Entry key="qs_location_name" type="System.String">
          <value>Location Name</value>
        </Entry>
        <Entry key="qs_location_riskAddress1" type="System.String">
          <value>Risk Address 1</value>
        </Entry>
        <Entry key="qs_location_riskAddress2" type="System.String">
          <value>Risk Address 2</value>
        </Entry>
</AnswersList>
</Answers>

Мой код такой, как показано ниже

from lxml import etree
from io import StringIO
tree = etree.parse(StringIO(xml_file))

root = tree.getroot().tag
for node in tree.iter():
    for child in node.getchildren():
        if child.text:
          if child.text.strip():
            print("{}.{} = {}".format(root, ".".join(tree.getelementpath(child).split("/")), child.text.strip()))

Вышекод обеспечивает следующий вывод:

AustraliaBizPackProposal.Answers.AnswersList.Entry[1].value = Location Name
AustraliaBizPackProposal.Answers.AnswersList.Entry[2].value = Risk Address 1
AustraliaBizPackProposal.Answers.AnswersList.Entry[3].value = Risk Address 2

Мой ожидаемый вывод - генерировать его, как показано ниже, пожалуйста, сообщите

AustraliaBizPackProposal.Answers.AnswersList.qs_location_name.value = Location Name
AustraliaBizPackProposal.Answers.AnswersList.qs_location_riskAddress1.value = Risk Address 1
AustraliaBizPackProposal.Answers.AnswersList.qs_location_riskAddress2.value = Risk Address 2

1 Ответ

0 голосов
/ 12 декабря 2018

Этот код работает для этого конкретного файла:

root = tree.getroot().tag
for node in tree.iter():
for child in node.getchildren():
    if child.tag == 'Entry':            
        path = tree.getelementpath(child).split("/")[0]
        key = child.attrib['key']
        for val in child.getchildren(): 
            try:                    
                print("{}.{}.{}.{} = {}".format(root, path, key, val.tag, val.text.strip()))
            except:
                print("{}.{}.{}.{} = {}".format(root, path, key, val.tag, val.attrib['Text']))
...