繁体   English   中英

如何从XML(Python)获取特定信息

[英]How to fetch particular info from XML (Python)

我需要从此XML脚本中获取用户名。 我阅读了Python中的元素树库,并尝试了他们对XML文件所做的工作,但没有成功。 我所需要的只是一个获取用户名的示例,这将非常有帮助并帮助我理解其余内容。 首先是XML文件,然后是代码。

<?xml version="1.0" encoding="UTF-8" ?> 
- <definitions name="GetEmailCert" targetNamespace="urn:GetEmailCert" 
xmlns="http://schemas.xmlsoap.org/wsdl/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tns="urn:GetEmailCert" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <message name="GetEmailCertRequest">
  <part name="username" type="xsd:string" /> 
  </message>
- <message name="GetEmailCertResponse">
  <part name="fullname" type="xsd:string" /> 
  <part name="email" type="xsd:string" /> 
  <part name="certificate" type="xsd:string" /> 
  </message>

from xml.etree.ElementTree import ElementTree


tree = ElementTree()
tree.parse("test.xml")
root = tree.getroot()
root.tag
root.attrib

for child in root:
        print child.tag, child.attrib
#This one works 

for username in root.iter('username'):
        print username
#This one I do not know how to correctly implement 

除了@Robᵩ发现的-连字符 )字符(这使我相信您从用户友好的显示工具复制/粘贴了XML Blob)之外,我还发现了2个附加字符

由于这些错误, XML仍然无效:

  • Pythonxml.etree.ElementTree无法解析
  • 2个Web浏览器( ChromeIE )无法呈现它

修复所有错误后,XML看起来像这样(请注意,我包裹一切都在根节点 (即我叫root )):

<?xml version="1.0" encoding="UTF-8" ?>
  <root>
    <definitions name="GetEmailCert" targetNamespace="urn:GetEmailCert"
      xmlns="http://schemas.xmlsoap.org/wsdl/"
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
      xmlns:tns="urn:GetEmailCert" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
    <message name="GetEmailCertRequest">
      <part name="username" type="xsd:string"/>
    </message>
    <message name="GetEmailCertResponse">
      <part name="fullname" type="xsd:string"/>
      <part name="email" type="xsd:string"/>
      <part name="certificate" type="xsd:string"/>
    </message>
  </root>

代码方面:有更多方式(包括XML库)可以实现您的目标; 我选择了一个使用[Python]的工具:xml.etree.ElementTree — ElementTree XML API (开始实施时)。

现在,我不太了解“ 获取用户名 ”是什么意思,但是我认为它是<part name="username" type="xsd:string"/>节点。 考虑到我的假设是正确的,这是类似于的方法(应该是通用的):

  • 的test.xml XML文档具有一个根节点 (标记的root
  • 根节点具有0个或多个 (2个用于我们的XML) 消息的节点(标记的message
  • 每个消息节点具有0个或更多的 part节点(标记的part
  • 每个部分节点可以具有或不具有其名字usernamename属性; 如果有,那就是我们想要的节点 (打印出来)

和代码:

import xml.etree.ElementTree as ET


def main():
    tree = ET.parse("test.xml")
    root_node = tree.getroot()

    message_nodes = root_node.iter("message")
    for message_node in message_nodes:
        part_nodes = message_node.iter("part")
        for part_node in part_nodes:
            if part_node.attrib.get("name", "") == "username":
                print(ET.tostring(part_node))


if __name__ == "__main__":
    main()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM