在 Excel get&transform 中扩展来自 XML 数据源的可变数量的文本标签

Expand variable number of text tags from XML data source in Excel get&transform

我正在尝试使用 Excel 的获取和转换功能(以前称为 powerquery)来导入 XML 数据源。数据源有一个 b 标签列表,每个标签在 c2 个子标签中具有可变数量的 d 标签,例如:

<a>
  <b>
    <c1>foo</c1>
    <c2>
      <d>bar</d>
    </c2>
  </b>
  <b>
    <c1>fuz</c1>
    <c2>
      <d>baz</d>
      <d>quz</d>
    </c2>
  </b>
</a>

当我使用以下查询导入此数据时,列 c2.d 的数据类型对于代表 b 项的两个不同行是不同的,对于第一行,它是一个通用电子表格单元格类型,第二行是 Table 类型。

let
    Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
    Table0 = Source{0}[Table],
    #"Changed Type" = Table.TransformColumnTypes(Table0,{{"c1", type text}}),
    #"Expanded c2" = Table.ExpandTableColumn(#"Changed Type", "c2", {"d"}, {"c2.d"})
in
    #"Expanded c2"

对于第一行,它似乎自动将 d 标记转换为一个简单的电子表格单元格,因为只有一个,而且它只包含文本。然而,对于第二行,它看到有两个 d 标签,因此将其保留为 table。现在的问题是我既不能按原样加载数据,因为第二行中的 Table 被加载到电子表格中作为文字字符串 "Table" 让我没有实际数据,也不能进一步扩展Table 使用 Table.ExpandTableColumn 因为它(正确地)抱怨第一行的 bar 不是 table.

我假设在 Xml.TablesExpandTableColumn 函数中会自动将包含文本的单个标记自动转换为简单单元格而不是 table。 Xml.Tables 的工具提示显示它有一个 options 参数,不幸的是 documentation for Xml.Tables 没有给出这个 options 参数的任何细节。

我怎样才能将第二行扩展为两行,第二个 b 标签中包含的两个 d 标签各一行,其中具有相同的 "fuz" 字符串第一栏?如果 d 标签的内容是进一步的 XML 标签,这样的扩展工作正常,但如果 d 标签只包含文本,则显然不行。

让我们添加一个步骤以确保所有内容都处于同一级别:

let
    Source = Xml.Tables(File.Contents("C:\Localdata\excel-powerquery-test2.xml")),
    Table0 = Source{0}[Table],
    Expandc2 = Table.ExpandTableColumn(Table0, "c2", {"d"}, {"d"}),
    ToLists = Table.TransformColumns(Expandc2,
                  {"d", each if _ is table then Table.ToList(_) else {_}}),
    ExpandLists = Table.ExpandListColumn(ToLists, "d")
in
    ExpandLists

ToLists 步骤变成这样:

转换为更一致的列表格式:

c1       d
-----------------------
foo     {"bar"}
fuz     {"baz", "quz"}

然后您可以扩展到没有混合数据类型的行。