为了账号安全,请及时绑定邮箱和手机立即绑定

XML中的python HTTP响应数据

XML中的python HTTP响应数据

白猪掌柜的 2021-12-17 10:41:11
我有一个 HTTP 请求,我知道它的响应数据看起来像<?xml version="1.0" encoding="utf-8"?><TestSpec xmlns="TestSpec.xsd">  <Tests>    <TestCase>      <TestCase>abc</TestCase>    </TestCase>  </Tests></TestSpec>我正在尝试检索它的数据,以便我可以验证 g0 的响应数据    parser = etree.HTMLParser()    tree=etree.fromstring(g0.text.encode('utf8'), parser)我怎样才能得到我试过的那些数据    print ("\ntree= "+ str(tree.TestCase))但它不起作用
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

假设g0.text.encode('utf8')返回您提供的示例 XML 字符串,那么您不需要使用 HTML 解析器。尝试这样的事情:


tests = etree.fromstring(g0.text.encode('utf8'))[0] # Notice the "[0]" here


for testCase in tests.findall("{TestSpec.xsd}TestCase"): # Notice the namespace here

    print(testCase[0].text)

在上面的代码中,我曾经[0]获取根元素的第 0 个(第一个)子元素,也就是<Tests>标签。for 循环使用findallwhich 返回Tests与给定标签名称匹配的标签下的所有子项。请注意,我<TestSpec>在标记名称前的方括号中包含了顶级标记中的命名空间。在这种情况下,findall返回所有外部<TestCase>标签。在我[0]再次使用的循环中,它是<TestCase>标签的第一个孩子;在这种情况下,内部<TestCase>. 最后.text是包含“abc”的属性。


这将适用于这样的 XML:


<?xml version="1.0" encoding="utf-8"?>

<TestSpec xmlns="TestSpec.xsd">

  <Tests>

    <TestCase>

      <TestCase>abc</TestCase>

    </TestCase>

    <TestCase>

      <TestCase>def</TestCase>

    </TestCase>

    <TestCase>

      <TestCase>ghi</TestCase>

    </TestCase>

  </Tests>

</TestSpec>

但不是这样:


<?xml version="1.0" encoding="utf-8"?>

<TestSpec xmlns="TestSpec.xsd">

  <Tests>

    <TestCase>

      <TestCase>abc</TestCase>

      <TestCase>def</TestCase>

      <TestCase>ghi</TestCase>

    </TestCase>

  </Tests>

</TestSpec>

在这种情况下,您需要使用findall或 其他一些迭代方法,而不是[0]对第一个孩子进行硬编码。像这样的东西:


for outerTestCaseTag in tests.findall("{TestSpec.xsd}TestCase"):

    for innerTestCase in outerTestCaseTag.findall("{TestSpec.xsd}TestCase"):

        print(innerTestCase.text) 

第一个[0]获得<Tests>标签的人也是如此。我确信有一些更好的“pythonic”循环理解来改进嵌套循环,但这是一般的想法。


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信