You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Databricks环境下PySpark展开XML嵌套节点并转为表格

XML扁平化转表格实现方案

以下是两种可直接落地的实现方法,核心逻辑是将嵌套的batter、topping节点做笛卡尔积展开,与上层item的固定属性拼接,最终生成「1种item + 1种面糊 + 1种配料」为一行的标准表格结构。


方法1:Python实现(适合批量处理、开发场景)

依赖xml.etree.ElementTree(Python标准库)、pandas(需单独安装pip install pandas)

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

# 解析XML文件
tree = ET.parse('你的XML文件路径.xml')
root = tree.getroot()

result_rows = []
for item in root.findall('item'):
    # 提取item层固定字段
    base_info = {
        'item_id': item.get('id'),
        'item_type': item.get('type'),
        'name': item.findtext('name'),
        'ppu': item.findtext('ppu')
    }
    # 提取所有batter节点
    batter_list = []
    for batter in item.find('batters').findall('batter'):
        batter_list.append({
            'batter_id': batter.get('id'),
            'batter_name': batter.text
        })
    # 提取所有topping节点
    topping_list = []
    for topping in item.findall('topping'):
        topping_list.append({
            'topping_id': topping.get('id'),
            'topping_name': topping.text
        })
    # 拼接生成所有组合行
    for b in batter_list:
        for t in topping_list:
            row = base_info.copy()
            row.update(b)
            row.update(t)
            result_rows.append(row)

# 转为标准表格结构,可直接导出为csv
df = pd.DataFrame(result_rows)
df.to_csv('output.csv', index=False, encoding='utf-8-sig')
# 控制台预览结果
print(df)

运行后会生成3种面糊×6种配料=18行的标准表格,列包括item_id/item_type/name/ppu/batter_id/batter_name/topping_id/topping_name。


方法2:XSLT实现(适合纯XML处理场景,无需编程语言)

使用以下XSLT样式表,对原XML应用转换即可直接输出CSV格式表格:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/">
    <!-- 输出表头 -->
    <xsl:text>item_id,item_type,name,ppu,batter_id,batter_name,topping_id,topping_name&#10;</xsl:text>
    <xsl:for-each select="items/item">
        <xsl:variable name="base" select="concat(@id,',',@type,',',name,',',ppu,',')"/>
        <xsl:for-each select="batters/batter">
            <xsl:variable name="batter" select="concat(@id,',',text(),',')"/>
            <xsl:for-each select="../../topping">
                <xsl:value-of select="$base"/>
                <xsl:value-of select="$batter"/>
                <xsl:value-of select="concat(@id,',',text(),'&#10;')"/>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

可使用浏览器、libxslt、XMLSpy等任意支持XSLT的工具运行转换。


内容的提问来源于stack exchange,提问作者SIDDHARTHA SUMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:18:02