非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 </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(),' ')"/> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
可使用浏览器、libxslt、XMLSpy等任意支持XSLT的工具运行转换。
内容的提问来源于stack exchange,提问作者SIDDHARTHA SUMAN
相关产品推荐
相关产品推荐

