【问题标题】:Parsing xml with multiple children解析具有多个子项的 xml
【发布时间】:2021-03-09 22:58:40
【问题描述】:

我正在尝试使用 python 解析一个 xml 文件,它在 s_amount 行上返回一个AttributeError 'NoneType' object has no attribute 'text'。 xml 文件包含 n 个产品的产品 ID、数量、数量和价格信息(示例文件中为三个),理想情况下,我希望生成一个表,其中每个产品 ID 一行,并在可用的情况下填写相关列(数量、数量和价格信息)。产品 5340958 会有多行,因为它有多个数量。

xml文件提取:

<?xml version="1.0" encoding="UTF-8"?>
<pricebooks xmlns="http:...">
    <pricebook>
        <header pricebook-id="IT21">
            <currency>EUR</currency>
        </header>

        <price-tables>
            <price-table product-id="16780001">
                <amount quantity="1">15.00</amount>
                <price-info>2021</price-info>
            </price-table>

            <price-table product-id="5340958">
                <amount quantity="1">5</amount>
                <amount quantity="2">5</amount>
                <amount quantity="3">50</amount>
            </price-table>

            <price-table product-id="864564543">
                <amount quantity="1">60</amount>
            </price-table>

        </price-tables>
    </pricebook>
</pricebooks>

当前python脚本:

import pandas as pd
import xml.etree.ElementTree as et

xtree = et.parse("C:...ITfile.xml")
xroot = xtree.getroot()

df_cols = ["product-id", "quantity", "amount", "price-info"]
rows = []
for pricebook in xroot:
    for element in pricebook[1:]:
        for pricetable in element:
            s_product_id = pricetable.attrib.get("product-id")
            rows.append({"product-id": s_product_id})
            for item in pricetable:
                s_quantity = item.attrib.get("quantity")
                rows.append({"quantity": s_quantity})
                s_amount = item.find("amount").text
                rows.append({"amount": s_amount})

out_df = pd.DataFrame(rows, columns = df_cols)

【问题讨论】:

  • 也许应该是s_amount = item.text?你必须检查item 是否引用&lt;amount&gt; 标签。

标签: python xml dataframe xml-parsing elementtree


【解决方案1】:

你可以使用这个sn-p将XML文件中的数据解析为DataFrame:

import pandas as pd
import xml.etree.ElementTree as et


xtree = et.parse("file.xml")
namespaces = {'myprefix':'http:...'}  # <-- this is from <pricebooks xmlns="http:...">

df_cols = ["product-id", "quantity", "amount", "price-info"]
rows = []

for row in xtree.findall('.//myprefix:price-table[@product-id]', namespaces):
    price_info = row.find('.//myprefix:price-info', namespaces)
    if not price_info is None:
        price_info = price_info.text
    for amount in row.findall('.//myprefix:amount[@quantity]', namespaces):
        rows.append(dict(zip(df_cols, [row.attrib.get('product-id'), amount.attrib.get('quantity'), amount.text, price_info])))


df = pd.DataFrame(rows)
print(df)

打印:

  product-id quantity amount price-info
0   16780001        1  15.00       2021
1    5340958        1      5       None
2    5340958        2      5       None
3    5340958        3     50       None
4  864564543        1     60       None

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多