如何格式化 XML 响应 - Python

Posted

技术标签:

【中文标题】如何格式化 XML 响应 - Python【英文标题】:How can I format the XML response - Python 【发布时间】:2022-01-22 01:37:20 【问题描述】:

我正在尝试从 XML 响应中获取一些值,但出现此错误。

为什么 json.loads 不起作用?

我所做的是将字节中的响应转换为 str。 然后使用负载格式化文件以获取值。

有没有人知道如何格式化这个回复?

从 None 提高 JSONDecodeError("Expecting value", s, err.value) json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

这是我目前的代码。

import json, requests, urllib.parse, re
from termcolor import colored
import numpy as np
import sqlite3, math, jmespath, os
import pandas as pd
import xmltodict

# Set Up
dateinplay = "2021-11-29"
cdwenv1 = "cdwu"  # Note that it only works with the http version right now

emberEndPoint = "http://emberu:8084/ember/v2/hierarchy/" 
tempdir = r"J:\E2E Testing Service\2.- Improvement\ALP Project"
dbname = f"tempdir\\ALP.sqlite"
batchsize = 3000

conn = sqlite3.connect(dbname)

# Dev Static
cdwenv = ""  # leave empty


# Create a list of all books from Ember
emberRaw = requests.get(emberEndPoint + dateinplay).text
ember_str = str(emberRaw).encode("cp850", "replace").decode("cp850")
emberJsonObj = json.loads(ember_str)
# print(emberJsonObj)

XML 响应:

<cmfHierarchy reportingDateTime="2021-12-20T03:04:39.028+00:00" asOfDate="2021-11-29+00:00">
  <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="2" unitEndDate="9999-12-31Z" unitStartDate="1900-01-01Z" status="Active" categoryName="Legal Entity" categoryCode="LE" name="Mizuho Securities Group" code="MHSC" id="LE0MHSC">
    <identifiers>
      <identifier value="2278" name="UnitId" system="MiCore"></identifier>
    </identifiers>
    <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="3" parentCategoryName="Legal Entity" parentCode="MHSC" unitEndDate="9999-12-31Z" unitStartDate="1900-01-01Z" parent="LE0MHSC" status="Active" categoryName="Legal Entity" categoryCode="LE" name="MSUK Holdings Group" code="MSUKG" id="LEMSUKG">
      <identifiers>
        <identifier value="2291" name="UnitId" system="MiCore"></identifier>
      </identifiers>
      <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="8690" parentCategoryName="Legal Entity" parentCode="MSUKG" unitEndDate="9999-12-31Z" unitStartDate="2009-12-01Z" oracleCode="72701" parent="LEMSUKG" status="Active" categoryName="Legal Entity" categoryCode="LE" name="Mizuho International" code="MHI" id="LE00MHI">
        <identifiers>
          <identifier value="2059" name="UnitId" system="MiCore"></identifier>
        </identifiers>
        <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="6995" parentCategoryName="Legal Entity" parentCode="MHI" unitEndDate="9999-12-31Z" unitStartDate="2011-04-01Z" parent="LE00MHI" status="Active" categoryName="Division" categoryCode="DV" name="Central" code="00021" id="DV00021">
          <identifiers>
            <identifier value="2706" name="UnitId" system="MiCore"></identifier>
          </identifiers>
          <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="6996" parentCategoryName="Division" parentCode="00021" unitEndDate="9999-12-31Z" unitStartDate="2011-04-01Z" parent="DV00021" status="Active" categoryName="Business" categoryCode="BU" name="Central" code="00184" id="BU00184">
            <identifiers>
              <identifier value="2707" name="UnitId" system="MiCore"></identifier>
            </identifiers>
            <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="6997" parentCategoryName="Business" parentCode="00184" unitEndDate="9999-12-31Z" unitStartDate="2011-04-01Z" parent="BU00184" status="Active" categoryName="Department" categoryCode="DP" name="Central" code="00174" id="DP00174">
              <identifiers>
                <identifier value="2708" name="UnitId" system="MiCore"></identifier>
              </identifiers>
              <unit unitValidToDate="9999-12-31Z" unitValidFromDate="2019-10-30Z" orderBy="7068" parentCategoryName="Department" parentCode="00174" unitEndDate="9999-12-31Z" unitStartDate="2011-04-01Z" oracleCode="STR-0134" parent="DP00174" status="Active" categoryName="Cost Centre" categoryCode="CC" name="International Dept" code="0134" id="CC00134">
                <identifiers>
                  <identifier value="2709" name="UnitId" system="MiCore"></identifier>
                </identifiers>
              </unit>
            </unit>
          </unit>
        </unit>

【问题讨论】:

b'' 表示它是一个字节串。你可以 .encode() 这个来创建 utf-8 【参考方案1】:

XML 前面的'b' 表示您正在打印的数据类型是字节数组(不是字符串)。

如果你想漂亮地打印你的 XML,你可以用 XML 解析器解析它,然后像这样漂亮地打印它:

import lxml.etree as etree
from io import BytesIO
fp = BytesIO(emberObj)
x = etree.parse(fp)
print(etree.tostring(x, pretty_print=True))

【讨论】:

以上是关于如何格式化 XML 响应 - Python的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

如何将 XML 格式转换为 JSON 格式

改造:如何发出 XML 请求并取回 JSON 响应

python如何向页面传xml格式的数据?

python 如何从XML格式的文件中获取内容

AJAX---响应数据格式