python - 在 Python 中使用 ElementTree 从 XML 中提取数据

标签 python xml parsing elementtree

我有以下 XML 文件,我必须解析该文件并将数据提取到 csv 文件中。在这个文件中,我有两个盒子(box_id),它们包装在两个不同的父对象(parent_box_id)上,并且还有每个盒子内容的详细信息(元素 sgtin -> info_sgtin)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<doc>
    <info id_reference="2">
        <data_down>
            <tree>
                <box_id>046071598600870568</box_id>
                <parent_box_id>046071598600875594</parent_box_id>
            </tree>
            <tree>
                <box_id>046071598600870575</box_id>
                <parent_box_id>046071598600875595</parent_box_id>
            </tree>
            <tree>
                <sgtin>
                    <info_sgtin>
                        <sgtin>04607008133585B0SE1HVHBGR3A</sgtin>
                        <box_id>046071598600870568</box_id>
                        <gtin>04607008133585</gtin>
                        <series_number>026A</series_number>
                    </info_sgtin>
                </sgtin>
                <parent_box_id>046071598600870568</parent_box_id>
            </tree>
            <tree>
                <sgtin>
                    <info_sgtin>
                        <sgtin>046070081335856F7P78HBVBEH2</sgtin>
                        <box_id>046071598600870568</box_id>
                        <gtin>04607008133585</gtin>
                        <series_number>026A</series_number>
                    </info_sgtin>
                </sgtin>
                <parent_box_id>046071598600870568</parent_box_id>
            </tree>
            <tree>
                <sgtin>
                    <info_sgtin>
                        <sgtin>046070081335854T61H7CSXDE9W</sgtin>
                        <box_id>046071598600870575</box_id>
                        <gtin>04607008133585</gtin>
                        <series_number>026A</series_number>
                    </info_sgtin>
                </sgtin>
                <parent_box_id>046071598600870575</parent_box_id>
            </tree>
        </data_down>
    </info>
</doc>

为此,我决定在 Python 中使用 Elementtree,但问题是在我的 XML 文件中,我有两种标记变体。

首先,我遍历所有详细信息并捕获 box_id 值,但之后我必须转到父项并获取包含此 box_id 的parent_box_id。

换句话说,我想通过以下方式获取数据:

parent_box_id       box_id              sgtin                           series_number
046071598600875594  046071598600870568  04607008133585B0SE1HVHBGR3A     026A
046071598600875594  046071598600870568  046070081335856F7P78HBVBEH2     026A
046071598600875595  046071598600870575  046070081335854T61H7CSXDE9W     026A

但我不知道如何获取parent_box_id 值。感谢社区的任何支持。

这是我的代码:

import csv
import xml.etree.ElementTree as ET

csv.writer(open('result.csv','w'),delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL))

tree = ET.parse('test.xml')
root = tree.getroot()

with open('result.csv','a',newline='') as myfile:
    writer = csv.writer(myfile, delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)

    for alist in root.iter('info_sgtin'):
    sgtin = alist.find('sgtin').text
    box_id = alist.find('box_id').text
    series = alist.find('series_number').text

    writer.writerow([sgtin,box_id,series])

最佳答案

您需要循环遍历每个 <tree>标记并检查是否有您需要的数据。然后收集起来。

import xml.etree.ElementTree


root = xml.etree.ElementTree.parse('data.xml')

# collect parent data
parent_data = {}
for item in root.iter('tree'):
    box_id_match = item.find('box_id')
    parent_box_id_match = item.find('parent_box_id')
    if box_id_match != None:
        parent_data.update({box_id_match.text: parent_box_id_match.text})

data = []
for item in root.iter('tree'):
    sgtin = item.find('sgtin/info_sgtin/sgtin')
    box_id = item.find('sgtin/info_sgtin/box_id')
    series_number = item.find('sgtin/info_sgtin/series_number')
    # collect valid data
    if sgtin != None and box_id != None and series_number != None:
        parent_box_id = parent_data.get(box_id.text)
        data.append([parent_box_id, box_id.text, sgtin.text, series_number.text])

输出:

['046071598600875594', '046071598600870568', '04607008133585B0SE1HVHBGR3A', '026A']
['046071598600875594', '046071598600870568', '046070081335856F7P78HBVBEH2', '026A']
['046071598600875595', '046071598600870575', '046070081335854T61H7CSXDE9W', '026A']

关于python - 在 Python 中使用 ElementTree 从 XML 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60390818/

相关文章:

java - Woodstox StAX - 如何关闭文本内容验证?

javascript - 如何在 JavaScript 中解析 xml 字符串? (与客户端无关,与浏览器相关)

python - 在 Python 中评估数学表达式

python - Python 请求的 SSL 证书问题

python - 读取带有二进制内容的 XML

C# XML 数组反序列化

xml - XSLT - 如何修剪 xsl :value-of expressions 中的所有值

Java:使用 SAXParser 拆分大型 XML 文件

python - 通过 pickle(或其他)将 json 数据从 python 传递到 rust

python - 无法在 python 可执行文件上加载 mkl_intel_thread.dll