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

如何从XML(Python)中获取特定信息,python,xml,Python,Xml,我需要从这个XML脚本中获取用户名。我阅读了Python中的元素树库,并尝试了他们对我的XML文件所做的操作,但没有成功。我所需要的只是一个获取用户名的示例,这将非常有帮助,并帮助我理解其余内容。首先是XML文件,然后是代码 <?xml version="1.0" encoding="UTF-8" ?> - <definitions name="GetEmailCert" targetNamespace="urn:GetEmailCert" xmlns="http://sc

我需要从这个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>

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

  • 定义
    节点未正确关闭
  • XML有多个根节点(在本例中为3个)。根据: 定义:只有一个元素,称为根元素或文档元素

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

  • Python的
    xml.etree.ElementTree
    无法解析它
  • 2个Web浏览器(Chrome和IE)无法渲染它
修复所有错误后,XML看起来是这样的(注意,我已经将所有内容封装在根节点中(我称之为
root
):


XML中的
-
字符使其无效。它们是否存在于实际文件中?
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 
<?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>
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()