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

2024-10-03 00:19:50 发布

您现在位置: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 

Tags: nameorghttpmessagestringtypeusernameroot
1条回答
网友
1楼 · 发布于 2024-10-03 00:19:50

除了@Robᵩ发现的-hyphen)字符(这让我相信您从用户友好的显示工具复制/粘贴了XMLblob),我还发现了另外两个字符:

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

  • Python的xml.etree.ElementTree无法解析它
  • 2个网络浏览器(ChromeIE)无法呈现它

在修复所有错误之后,XML看起来是这样的(注意,我已经将所有内容封装在root节点(我称之为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 — The ElementTree XML API(在您开始实现时)的方法。你知道吗

现在,我不太明白您所说的“获取用户名”是什么意思,但我假设它是<part name="username" type="xsd:string"/>节点。考虑到我的假设是正确的,下面是类似树的方法(应该是一般的):

  • 来自XML文档测试.xml有一个节点(标记为root
  • 节点有0个或更多(2个用于我们的XML消息节点(标记为message
  • 每个消息节点具有0个或更多部分节点(标记为part
  • 每个部分节点可能有也可能没有名称属性,其值为username;如果有,则是我们想要的节点(打印它)

代码是:

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()

相关问题 更多 >