使用 Power Query 通过 REST API 查询分页 XML

Posted

技术标签:

【中文标题】使用 Power Query 通过 REST API 查询分页 XML【英文标题】:Query Paginated XML via REST API using Power Query 【发布时间】:2021-02-16 10:14:13 【问题描述】:

我收到此错误:Expression.Error:在评估期间遇到循环引用。 我认为它在这一行: = Table.FromList(DataList, Splitter.SplitByNothing(), null, null, ExtraValues.Error)

我在 PowerBI 中使用高级 Web 输入,但 API 将每个查询的请求限制为 100 条记录。

let 
    BaseUrl = "https://api.samanage.com/incidents.xml",
    Token =  [TOKEN],
    EntitiesPerPage = 100,
    Options = [Headers=[Accept="application/vnd.samanage.v2.1+xml", #"X-Samanage-Authorization" = "Bearer " & Token ]],
    Url = BaseUrl,

    GetXml = (Url) =>
        let
            RawData = Web.Contents(Url, Options),
            xml = Xml.Document(RawData)
        in
            xml,

    GetTotalCount = () =>
        let
            Xml = GetXml(Url),
            Entities = Xml(EntityCount)
        in
            Entities,

    EntityCount = GetTotalCount(),
    PageCount = Number.RoundUp(EntityCount / EntitiesPerPage),
    PageIndex =  1 .. PageCount,

    GetPage = (PageIndex) =>
        let
            PageUrl = BaseUrl & "page=" & Text.From(PageIndex),
            Xml = GetXml(PageUrl),
            Value = Xml[ticket_metrics]
        in
            Value,

    GetUrl = (PageIndex) =>
        let
            PageNum = "page=" & Text.From(PageIndex),
            PageUrl = BaseUrl & PageNum
        in
            PageUrl,

    Urls = List.Transform(PageIndex, each GetUrl(_)),
    Pages = List.Transform(PageIndex, each GetPage(_)),
    DataList = List.Union(Pages),

    TableFromList = Table.FromList(DataList, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    TableFromList

【问题讨论】:

【参考方案1】:

我没有运行你的代码,所以我在下面写的内容可能完全错了,但我认为在你的 GetTotalCount 函数中,你可能打算写:

Entities = Xml[EntityCount]

改为:

Entities = Xml(EntityCount)

我假设(但我可能错了)您正在使用的 XML 资源中有一个 EntityCount 字段。


关于周期性错误,如果我们采取这一行:

EntityCount = GetTotalCount(),

再往里看GetTotalCount,我们看到它循环引用了EntityCount

GetTotalCount = () =>
    let
        Xml = GetXml(Url),
        Entities = Xml(EntityCount)
    in
        Entities,

无关:通常,如果您想从 API 获取一些数据,但从一开始就不确定需要多少请求,您可以使用类似 List.Generate 的东西,它将继续生成值列表(在您的情况下,这些值可能是顺序 API 响应)并且您可以给它一个函数来定义它应该何时停止。

详情:https://docs.microsoft.com/en-us/powerquery-m/list-generate。

【讨论】:

以上是关于使用 Power Query 通过 REST API 查询分页 XML的主要内容,如果未能解决你的问题,请参考以下文章

Power Query 将表类型数据加载到单个 Excel 工作表

Power BI Python 在Power BI Desktop中Python代码如何使用Power Query数据

通过 Power Query 将 Excel 连接到 Smartsheet

如何通过power+query将10列数据各乘1000?

通过 Power Query 在 Excel 中的 Smartsheet 数据

Power BI:如何在 Power Query 编辑器中将 Python 与多个表一起使用?