2017-06-06 105 views
2

我需要從這個XML腳本中獲取用戶名。我閱讀了Python中的元素樹庫,並嘗試了他們對我的XML文件所做的工作,但無濟於事。我所需要的只是一個獲取用戶名的例子,這會非常有幫助,並幫助我理解其餘部分。首先是XML文件,然後是代碼。從人性化的顯示如何從XML中獲取特定信息(Python)

<?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 
+0

的'-'在你的XML字符使其無效。它們是否存在於實際文件中? –

回答

0

除了由@Robᵩ(這讓我相信你複製發現-連字符)炭/粘貼的XML BLOB工具),我發現了另外2個:

由於這些錯誤,XML仍然是無效的:

  • 的Pythonxml.etree.ElementTree無法比肩SE它
  • 2的Web瀏覽器(Chrome的 IE )未能使其

修復所有錯誤後,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 — 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()