Forum Discussion
YCastano
1 year agoFrequent Visitor
Consuming XML web service
Hello everyone! I need to consume data from a XML web service that generates what I show in the first image. The data is in the second table, but it only shows me 100 records, when there are alm...
- 1 year ago
Finally, I solved it by generating a Power Query loop to fetch all pages automatically, and later adding a counter for consulting only the last page and finally combining them. Here is the complete code:
let BaseUrl = "https://xxxxxxxxxxxxxxxxxx", // Función para obtener la página de datos GetPage = (pageNumber) => let // Realiza la solicitud con los parámetros adecuados Response = Web.Contents(BaseUrl, [Query=[page=Number.ToText(pageNumber)]]), // Convierte la respuesta XML en una tabla Data = Xml.Tables(Response), // La primera tabla contiene los parámetros de la consulta (paginación y demás) RequestInfo = Data{0}[Table], ExpandedFilter = Table.ExpandTableColumn(RequestInfo, "filter", {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}, {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}), // La segunda tabla contiene los datos DataTable = Data{1}[Table], Table1 = DataTable[Table], // Expande la tabla de datos ExpandedDataTable = Table.SelectColumns(ExpandedFilter, {"page", "more_pages"}), // Devuelve los datos junto con la información de la paginación PageData = [Data = DataTable, Pagination = ExpandedDataTable] in PageData, // Generar la lista de todas las páginas de datos AllData = List.Generate(// Estado inicial con la primera página () => [Page = Number.FromText(GetPage(1)[Pagination][page]{0}), Data = GetPage(1)[Data], MorePages = GetPage(1)[Pagination][more_pages]{0}], // Condición de continuidad: continuar mientras MorePages sea 1 (hay más páginas) each Number.FromText([MorePages]) = 1, each // Actualización del estado: aumentar la página y obtener los datos correspondientes let NextPage = [Page] + 1, PageData = GetPage(NextPage), NewMorePages = PageData[Pagination][more_pages]{0} in [Page = NextPage, Data = PageData[Data], MorePages = NewMorePages], // Extraer los datos de cada página each [Data] ), // Para capturar el núnmero de páginas, execptuando la última Contador = List.Count(AllData), // Combinar las tablas de datos de cada página en una tabla ExpandedData = Table.Combine(AllData), // Combinar y Expandir todas las tablas de registros Table1 = Table.Combine(ExpandedData[Table]), //Utilizo el contador para acceder a la última página LastPage = [Data = GetPage(Contador + 1)[Data], MorePages = GetPage(Contador + 1)[Pagination][more_pages]{0}], AllData2 = LastPage[Data], Table2 = AllData2{0}[Table], // Combinar las tablas de la primera parte con la tabla de la ultima página CombinedData = Table.Combine({Table1, Table2}), in CombinedData
YCastano
1 year agoFrequent Visitor
Finally, I solved it by generating a Power Query loop to fetch all pages automatically, and later adding a counter for consulting only the last page and finally combining them. Here is the complete code:
let
BaseUrl = "https://xxxxxxxxxxxxxxxxxx",
// Función para obtener la página de datos
GetPage = (pageNumber) =>
let
// Realiza la solicitud con los parámetros adecuados
Response = Web.Contents(BaseUrl, [Query=[page=Number.ToText(pageNumber)]]),
// Convierte la respuesta XML en una tabla
Data = Xml.Tables(Response),
// La primera tabla contiene los parámetros de la consulta (paginación y demás)
RequestInfo = Data{0}[Table],
ExpandedFilter = Table.ExpandTableColumn(RequestInfo, "filter", {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}, {"effective_date", "changed_on_or_after", "changed_before", "change_type", "deleted", "only_deleted", "page", "max_page_size", "actual_page_size", "more_pages"}),
// La segunda tabla contiene los datos
DataTable = Data{1}[Table],
Table1 = DataTable[Table],
// Expande la tabla de datos
ExpandedDataTable = Table.SelectColumns(ExpandedFilter, {"page", "more_pages"}),
// Devuelve los datos junto con la información de la paginación
PageData = [Data = DataTable, Pagination = ExpandedDataTable]
in
PageData,
// Generar la lista de todas las páginas de datos
AllData = List.Generate(// Estado inicial con la primera página
() => [Page = Number.FromText(GetPage(1)[Pagination][page]{0}), Data = GetPage(1)[Data], MorePages = GetPage(1)[Pagination][more_pages]{0}],
// Condición de continuidad: continuar mientras MorePages sea 1 (hay más páginas)
each Number.FromText([MorePages]) = 1,
each // Actualización del estado: aumentar la página y obtener los datos correspondientes
let
NextPage = [Page] + 1,
PageData = GetPage(NextPage),
NewMorePages = PageData[Pagination][more_pages]{0}
in
[Page = NextPage, Data = PageData[Data], MorePages = NewMorePages],
// Extraer los datos de cada página
each [Data]
),
// Para capturar el núnmero de páginas, execptuando la última
Contador = List.Count(AllData),
// Combinar las tablas de datos de cada página en una tabla
ExpandedData = Table.Combine(AllData),
// Combinar y Expandir todas las tablas de registros
Table1 = Table.Combine(ExpandedData[Table]),
//Utilizo el contador para acceder a la última página
LastPage = [Data = GetPage(Contador + 1)[Data], MorePages = GetPage(Contador + 1)[Pagination][more_pages]{0}],
AllData2 = LastPage[Data],
Table2 = AllData2{0}[Table],
// Combinar las tablas de la primera parte con la tabla de la ultima página
CombinedData = Table.Combine({Table1, Table2}),
in
CombinedData