2015-02-11 112 views
0

我正在嘗試查找所有節點的祖先。使用lxml查找所有xml節點python的祖先

我的XML,

xmldata=""" 
<OrganizationTreeInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/YSM.PMS.Web.Service.DataTransfer.Models"> 
<Name>Parent</Name> 
<OrganizationId>4345</OrganizationId> 
<Children> 
    <OrganizationTreeInfo> 
    <Name>A</Name> 
    <OrganizationId>123</OrganizationId> 
     <Children> 
      <OrganizationTreeInfo> 
       <Name>B</Name> 
       <OrganizationId>54</OrganizationId> 
       <Children/> 
      </OrganizationTreeInfo> 
     </Children> 
    </OrganizationTreeInfo> 
    <OrganizationTreeInfo> 
    <Name>C</Name> 
    <OrganizationId>34</OrganizationId> 
     <Children> 
      <OrganizationTreeInfo> 
       <Name>D</Name> 
       <OrganizationId>32323</OrganizationId> 
       <Children> 
        <OrganizationTreeInfo> 
         <Name>E</Name> 
         <OrganizationId>3234</OrganizationId> 
         <Children/> 
        </OrganizationTreeInfo> 
       </Children> 
      </OrganizationTreeInfo> 
     </Children> 
    </OrganizationTreeInfo> 
</Children> 

「」」

用於例如如果OrganizationId的我輸入值3234,那麼輸出應該是這樣的,

{'parent':4345,'C':34,'D':32323,'E':3234 } 

這裏是我的嘗試,

root = ET.fromstring(xmldata) 
for target in root.xpath('.//OrganizationTreeInfo/OrganizationId[text()="3234"]'): 
    d = { 
     dept.find('Name').text: int(dept.find('OrganizationId').text) 
     for dept in target.xpath('ancestor-or-self::OrganizationTreeInfo') 
    } 
    print(d) 

但它沒有給出任何輸出。我無法找出它有什麼問題。

+0

我不明白你的輸出。用'323'不會是'AB'。而且,A'節點也不是父母嗎? – Birei 2015-02-11 10:53:08

+0

@Birei對不起,我只是更新了我的問題,請看看。 – Guest00983835 2015-02-11 11:14:25

+0

現在它似乎更好,但仍然不正確(我認爲)。現在'3234'不出現在'xml'文件中。 – Birei 2015-02-11 11:16:51

回答

1

你沒有得到正確的答案,因爲命名空間 xmlns="http://schemas.datacontract.org/2004/07/YSM.PMS.Web.Service.DataTransfer.Models"

的在與命名空間代碼:

代碼:

import lxml.etree as ET 

root = ET.fromstring(xmldata) 

result = {} 
count = 1 
namespaces1={'xmlns':'http://schemas.datacontract.org/2004/07/YSM.PMS.Web.Service.DataTransfer.Models',} 
for target in root.xpath('.//xmlns:OrganizationTreeInfo/xmlns:OrganizationId[text()="3234"]',\ 
         namespaces=namespaces1): 
    result[count] = {} 
    for dept in target.xpath('ancestor-or-self::xmlns:OrganizationTreeInfo', namespaces=namespaces1): 
      result[count][dept.find('xmlns:Name', namespaces=namespaces1).text] = int(dept.find('xmlns:OrganizationId', namespaces=namespaces1).text) 

    count += 1 

import pprint 
pprint.pprint(result) 

輸出:

:~/workspace/vtestproject/study$ python test1.py 
{1: {'C': 34, 'D': 32323, 'E': 3234, 'Parent': 4345}} 

用其他臨時字符串替換xmlns=字符串。

代碼:

import lxml.etree as ET 

new_xmldata = xmldata.replace("xmlns=", "xmlnamespace=") 

root = ET.fromstring(new_xmldata)#, namespace="{http://schemas.datacontract.org/2004/07/YSM.PMS.Web.Service.DataTransfer.Models}") 

result = {} 
count = 1 
for target in root.xpath('.//OrganizationTreeInfo/OrganizationId[text()="3234"]'): 
    result[count] = {} 
    for dept in target.xpath('ancestor-or-self::OrganizationTreeInfo'): 
      result[count][dept.find('Name').text] = int(dept.find('OrganizationId').text) 

    count += 1 

import pprint 
pprint.pprint(result) 

輸出:

:~/workspace/vtestproject/study$ python test1.py 
{1: {'C': 34, 'D': 32323, 'E': 3234, 'Parent': 4345}} 
相關問題