Power Query嵌套表转字符串求助:XML处理后列格式不符
嘿,我来帮你搞定这个XML嵌套表转字符串的问题!根据你描述的需求——处理XML后输出包含两列(一列嵌套表转字符串、一列单一值),我整理了几种实用的解决方案,你可以根据自己的技术栈来选:
方案1:用Python(xml.etree.ElementTree)处理
这个方案灵活性拉满,适合需要后续做数据加工的场景。先假设你的XML结构大概是这样的(你可以对应替换成自己的实际节点名):
<root> <item> <singleValue>示例单一值1</singleValue> <nestedTable> <row> <colA>数据1A</colA> <colB>数据1B</colB> </row> <row> <colA>数据2A</colA> <colB>数据2B</colB> </row> </nestedTable> </item> <item> <singleValue>示例单一值2</singleValue> <nestedTable> <row> <colA>数据3A</colA> <colB>数据3B</colB> </row> </nestedTable> </item> </root>
对应的处理代码可以这么写:
import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse('your_file.xml') root = tree.getroot() # 遍历每个item,处理并输出两列 for item in root.findall('item'): # 提取单一值列 single_val = item.find('singleValue').text.strip() # 处理嵌套表转字符串:这里按"行数据|行数据"的格式拼接,你可以自定义分隔符 nested_rows = [] for row in item.find('nestedTable').findall('row'): # 每行内的列用逗号分隔,行之间用竖线分隔,可按需调整 row_str = ','.join([col.text.strip() for col in row.findall('./*')]) nested_rows.append(row_str) nested_table_str = '|'.join(nested_rows) # 输出结果(这里可以改成写入CSV/数据库等) print(f"{nested_table_str}\t{single_val}")
小说明
- 把代码里的节点名称(比如
singleValue、nestedTable、row)替换成你XML里的实际节点名就行 - 字符串格式完全自定义:行之间用换行、逗号,列之间用冒号都可以,调整
join里的分隔符就好
方案2:用XSLT直接转换XML
如果你的场景是纯XML到文本/结构化输出,XSLT是更原生的选择,不需要额外写复杂逻辑。同样基于上面的XML结构,写一个XSLT样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:template match="/root"> <!-- 遍历每个item --> <xsl:for-each select="item"> <!-- 处理嵌套表转字符串 --> <xsl:variable name="nestedStr"> <xsl:for-each select="nestedTable/row"> <xsl:if test="position() > 1">|</xsl:if> <!-- 行分隔符 --> <xsl:for-each select="./*"> <xsl:if test="position() > 1">,</xsl:if> <!-- 列分隔符 --> <xsl:value-of select="normalize-space(.)"/> </xsl:for-each> </xsl:for-each> </xsl:variable> <!-- 输出两列,用制表符分隔,可改成逗号等 --> <xsl:value-of select="$nestedStr"/> <xsl:text>	</xsl:text> <!-- 制表符 --> <xsl:value-of select="normalize-space(singleValue)"/> <xsl:text> </xsl:text> <!-- 换行 --> </xsl:for-each> </xsl:template> </xsl:stylesheet>
使用的时候,用任何支持XSLT的工具(比如Saxon、浏览器的XML处理器,或者Python的lxml库)把XML和XSLT结合转换,就能直接得到你要的两列输出。
额外小技巧
如果你的嵌套表结构更复杂(比如多层嵌套),或者需要保留原始XML结构的字符串形式,可以直接用ET.tostring()把整个嵌套表节点转成XML字符串:
nested_table_str = ET.tostring(item.find('nestedTable'), encoding='unicode').strip()
这样就能拿到完整的嵌套表XML文本,适合需要保留结构的场景。
内容的提问来源于stack exchange,提问作者Lucas Marcolongo




