来自 REST API 调用的 PowerBI XML 数据源有时会返回“表”数据类型
Posted
技术标签:
【中文标题】来自 REST API 调用的 PowerBI XML 数据源有时会返回“表”数据类型【英文标题】:PowerBI XML Data Source from REST API Call sometimes returns "table" data type 【发布时间】:2021-12-30 22:38:08 【问题描述】:使用 PowerBI,我正在调用一个简单的 REST API,该 API 从 SAAS 应用程序返回 XML 文档。
在某些情况下,PowerBI 正在为 XML 可能具有空值的某些列创建 Table 类型。一个非常简单的 XML 示例是:
<Record>
<Location>
<id>123</id>
<code>abc</code>
</Location>
<Location>
<id>123</id>
<code></code> <========= 1/2 - changed this from <code/>
</Location>
</Record>
由于第二个 Location 记录中的 code 属性为空,因此当 PowerBI 读取此数据源时,它会将生成的 code 列视为“表”值。
example here
由于我有许多客户从同一个 SAAS 应用程序中提取数据,并且他们都可能/可能不使用特定的公共字段(例如代码),因此很难创建一个我可以与多个客户共享的公共模型。
我不是 Power Query 专家,但我已投入大量时间寻找在 Power Query 中动态“扩展”表类型列的方法。我已经好几次接近找到可行但无法解决此问题的解决方案。
展开后的表格中总会有两个值之一。它将是文本值或空值。永远不会超过这两个值。
非常感谢您的想法,第一个帮助我解决此问题的人可以获得一张星巴克礼品卡。
您可以调用 2 个 API 来验证此行为。 https://pbitest.proxy.beeceptor.com/ 创建所描述的问题。 https://pbitest2.proxy.beeceptor.com/ 按我期望 pbitest 的方式工作。
PBI 查询非常简单:
let Source = Xml.Tables(Web.Contents("https://pbitest2.proxy.beeceptor.com/")),
Table = Source0[Table]
in
Table
【问题讨论】:
我的想法,您看到的是Table
,这意味着您需要扩展到新行,但它不是表类型... Power query 正在读取加载的数据,如果您知道客户端不使用的字段,然后您可以过滤这些行,如果您可以显示图像如何显示数据,这将很有帮助。
请不要在您的问题中添加元评论。您应该可以自己删除此帖子。如果你不能,那就保持原样。
【参考方案1】:
奇怪的是,Power Query 认为像 <code></code>
这样表达的空元素是一个表。
这是一个针对该行为的丑陋查询。
let
xml = "<Record>
<Location>
<id>123</id>
<code>abc</code>
</Location>
<Location>
<id>124</id>
<code></code>
</Location>
</Record>",
Source = Xml.Document(xml),
#"Removed Other Columns" = Table.SelectColumns(Source,"Value"),
#"Expanded Value" = Table.ExpandTableColumn(#"Removed Other Columns", "Value", "Name", "Value", "Name", "Value.1"),
#"Removed Other Columns1" = Table.SelectColumns(#"Expanded Value","Value.1"),
#"Expanded Value.1" = Table.ExpandTableColumn(#"Removed Other Columns1", "Value.1", "Name", "Value", "Name", "Value"),
Table1 = Table.AddColumn(#"Expanded Value.1", "Value2",each if Value.Is([Value], type table) then Table.FirstValue([Value]) else [Value]),
#"Added Custom" = Table.AddColumn(#"Table1", "UID", each if [Name]="id" then [Value] else null),
#"Removed Columns" = Table.RemoveColumns(#"Added Custom","Value"),
#"Filled Down" = Table.FillDown(#"Removed Columns","UID"),
#"Renamed Columns" = Table.RenameColumns(#"Filled Down","Value2", "Value"),
#"Pivoted Column" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"[Name]), "Name", "Value"),
#"Removed Columns1" = Table.RemoveColumns(#"Pivoted Column","UID")
in
#"Removed Columns1"
【讨论】:
感谢大卫布朗。挑战在于,有时代码不会以表格的形式出现,而有时却会出现。同样的场景适用于为每个 xml 有效负载返回的每一列。不同的客户使用 SAAS 应用程序的方式不同,并且可能/可能不会使用报告中使用的特定列。我需要它是动态的并询问每一列,如果它是“表”类型,则展开该列。否则,忽略它。 不幸的是,我没有办法从源系统将空属性 (
) 更改为类似
的东西来解决问题。 PBI 应该能够识别这种情况并简单地创建具有空值的列。
如果我可以将 Table.ExpandTableColumn() 函数包装在“如果列是表类型”条件下,那么它将起作用。这将意味着在模型中进行大量手动工作,但总比没有好。
你能发布一个有问题的 XML 的例子吗?
我文章中的示例将导致我正在谈论的问题。 ID 将显示为文本,代码将显示为表格。 abc
以上是关于来自 REST API 调用的 PowerBI XML 数据源有时会返回“表”数据类型的主要内容,如果未能解决你的问题,请参考以下文章
如何阻止来自未知域/IP 对我的 REST API 的调用?
webpack服务器中的rest API调用(来自角度)返回401
来自 wordpress 的 REST API 调用中的服务不可用