Excel Power Query按节点名筛选导入XML数据的技术问询
Excel Power Query 处理XML数据的实用方案
场景1:简单XML数据提取(跳过指定节点,筛选目标节点)
假设你的XML结构类似:
<Root> <Agency Name="SampleAgency" /> <Site Name="SiteA" /> <Site Name="SiteB" /> <Site Name="SiteC" /> </Root>
要跳过<Agency>节点,提取所有<Site>的Name属性,可修改Power Query代码如下:
let Source = Xml.Tables(File.Contents("C:\your-xml-file.xml")), RootNodes = Source{0}[Children], FilteredSites = Table.SelectRows(RootNodes, each [Name] = "Site"), ExtractName = Table.SelectColumns(FilteredSites, {"Attributes"}), ExpandAttributes = Table.ExpandRecordColumn(ExtractName, "Attributes", {"Name"}, {"Site Name"}) in ExpandAttributes
场景2:复杂XML层级数据提取
假设你的XML结构类似:
<Measurement SiteName="MainSite"> <DataSource Name="Temperature"> <Data> <T>2024-05-20 12:00</T> <Value><25.3</Value> </Data> <Data> <T>2024-05-20 13:00</T> <Value><26.1</Value> </Data> </DataSource> </Measurement>
要提取SiteName属性、DataSource的Name属性、<T>的时间值和带<符号的<Value>值,Power Query代码如下:
let Source = Xml.Tables(File.Contents("C:\complex-xml-file.xml")), MeasurementNode = Source{0}, SiteName = MeasurementNode[Attributes][SiteName], DataSourceNode = MeasurementNode[Children]{0}, DataSourceName = DataSourceNode[Attributes][Name], DataNodes = DataSourceNode[Children], FilteredData = Table.SelectRows(DataNodes, each [Name] = "Data"), ExpandDataChildren = Table.ExpandListColumn(FilteredData, "Children"), PivotNodes = Table.Pivot(ExpandDataChildren, List.Distinct(ExpandDataChildren[Name]), "Name", "Value"), AddMetaColumns = Table.AddColumn(PivotNodes, "Site Name", each SiteName), AddDataSourceColumn = Table.AddColumn(AddMetaColumns, "DataSource Name", each DataSourceName), ReorderColumns = Table.ReorderColumns(AddDataSourceColumn, {"Site Name", "DataSource Name", "T", "Value"}) in ReorderColumns
核心问题解答
1. 如何按节点名筛选XML数据?
Power Query会把XML解析为带Name字段的表格,每行对应一个XML节点。直接用Table.SelectRows过滤[Name]字段即可:
Table.SelectRows(YourNodeTable, each [Name] = "目标节点名")
如果是多层级节点,先通过[Children]字段定位到目标层级的节点列表,再执行筛选。
2. 如何提取单例节点的内容?
- 提取属性:单例节点的属性存在
[Attributes]记录中,直接通过字段名访问,比如Node[Attributes][AttributeName] - 提取节点文本:单例节点的文本存在
[Value]字段中,叶子节点直接取Node[Value];有子节点的话,先定位到子节点再取[Value] - 保留特殊符号:Power Query默认不会转义XML中的特殊符号,直接提取
[Value]就能保留原始内容(比如<25.3会完整保留)
内容的提问来源于stack exchange,提问作者Sir Swears-a-lot
相关产品推荐
相关产品推荐

