我是python新手,正在寻找以下问题的解决方案:

我有个档案.如下所示的xml:

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <PRODUCT_DETAILS>
        <DESCRIPTION_SHORT>green cat w short hair</DESCRIPTION_SHORT>
        <DESCRIPTION_LONG>green cat w short hair and unlimited zoomies</DESCRIPTION_LONG>
    </PRODUCT_DETAILS>
    <PRODUCT_FEATURES>
        <FEATURE>
            <FNAME>Colour</FNAME>
            <FVALUE>green</FVALUE>
        </FEATURE>
        <FEATURE>
            <FNAME>Legs</FNAME>
            <FVALUE>14</FVALUE>
        </FEATURE>
    </PRODUCT_FEATURES>
    <PRODUCT_DETAILS>
        <DESCRIPTION_SHORT>blue dog w no tail</DESCRIPTION_SHORT>
        <DESCRIPTION_LONG>blue dog w no tail and unlimited zoomies</DESCRIPTION_LONG>
    </PRODUCT_DETAILS>
    <PRODUCT_FEATURES>
        <FEATURE>
            <FNAME>Colour</FNAME>
            <FVALUE>blue</FVALUE>
        </FEATURE>
        <FEATURE>
            <FNAME>Happiness Levels</FNAME>
            <FVALUE>11/10</FVALUE>
        </FEATURE>
    </PRODUCT_FEATURES>
</HEADER>

这是我的代码:

from lxml import etree as et
import pandas as pd

xml_data = et.parse('file2.xml')
products = xml_data.xpath('//HEADER')

headers=[elem.tag for elem in xml_data.xpath('//HEADER[1]//PRODUCT_DETAILS//*')]
headers.extend(xml_data.xpath('//HEADER[1]//FNAME/text()'))

rows = []

for product in products:

    row = [product.xpath(f'.//{headers[0]}/text()')[0],product.xpath(f'.//{headers[1]}/text()')[0]]
    
    f_values = product.xpath('.//FVALUE/text()')
    row.extend(f_values)    
    rows.append(row)

df = pd.DataFrame(rows,columns=headers)

df
# df.to_csv("File2_Export_V1.csv", index=False)

这是我想要的输出:

    DESCRIPTION_SHORT       DESCRIPTION_LONG                                Colour  Legs    Happiness Levels
0   green cat w short hair  green cat w short hair and unlimited zoomies    green   14      
1   blue dog w no tail      blue dog w no tail and unlimited zoomies        blue            11/10

我解决这个问题的try 是这样延伸一条线:

headers=[elem.tag for elem in xml_data.xpath('//HEADER[1]//PRODUCT_DETAILS//*'),('//HEADER[2]//PRODUCT_DETAILS//*')]

遗憾的是,我遇到了一个语法错误,没有解决方案.

如何调整代码以反映xml struct ?

Thank you in advance! ~C

推荐答案

也许不是最好的解决方案,但我认为它非常直截了当、清晰明了.

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

# Get xml object
tree = ET.parse('file2.xml')
root = tree.getroot()

# Create final DataFrame
out = pd.DataFrame()

# Loop over all products (Product = (DETAILS, FEATURES))
for i in range(0, len(root), 2):
    # Get all descriptions
    descriptions = [(child.tag, child.text) for child in root[i]]
    # Get all features
    features = [(child[0].text, child[1].text) for child in root[i + 1]]

    # Create a DataFrame, where columns are the tags, and values are, well, values
    temp_df = pd.DataFrame([[i[1] for i in descriptions + features]], columns=[i[0] for i in descriptions + features])

    # Append to final DataFrame
    out = pd.concat([out, temp_df])

Python相关问答推荐

如何在句子之间添加空白但忽略链接?

双情节在单个图上切换-pPython

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

如何在Pygame中绘制右对齐的文本?

Flask:如何在完整路由代码执行之前返回验证

如何在Power Query中按名称和时间总和进行分组

除了Python之外,可以替代bare?

如何使用stride_tricks.as_strided逆转NumPy数组

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何让 turtle 通过点击和拖动来绘制?

Pydantic 2.7.0模型接受字符串日期时间或无

难以在Manim中正确定位对象

处理(潜在)不断增长的任务队列的并行/并行方法

可变参数数量的重载类型(args或kwargs)

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

Django admin Csrf令牌未设置

在Python中使用yaml渲染(多行字符串)

(Python/Pandas)基于列中非缺失值的子集DataFrame