2013-03-28 174 views
-1

我想解析嵌套元素。我不介意使用XPathElement。例如,我想打印值的有幾個是在:查找元素和打印值

>>> root[0][0][0][0][0].tag 
'{http://www.domain.com/somepath/Schema}element' 
>>> root[0][0][0][0][0].text 
'findme' 

什麼是理想的方法通過XML文檔進行迭代,分析,並打印element值?這是我正在使用的模式的一個例子。

<?xml version="1.0" encoding="UTF-8"?> 
<data xsi:schemaLocation="http://www.domain.com/somepath/Schema file.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.domain.com/somepath/Schema"> 
    <one stuff0="" stuff1=""> 
     <two stuff0="" stuff1=""> 
      <three> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme</element> 
       </four> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme2</element> 
       </four> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme3</element> 
       </four> 
      </three> 
     </two> 
    </one> 
    <one stuff0="" stuff1=""> 
     <two stuff0="" stuff1=""> 
      <three> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme4</element> 
       </four> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme5</element> 
       </four> 
       <four stuff0="234234" stuff1="234324"> 
        <element>findme6</element> 
       </four> 
      </three> 
     </two> 
    </one> 
</data> 

我試過以下,雖然沒有結果返回。即使這樣做了工作,也不會看到,雖然下根元素1 [0] 1 [0] [0]等:

>>> for tagname in root[0][0][1][0][0].findall('element'): 
... name = tree.get('element') 
... print name 
... 
>>> 

每本question,我自己也嘗試沒有成功如下:

發現
>>> for elem in doc.findall('one/two/three/four'): 
...  print value.get('stuff1'), elem.text 
... 
>>> 

問題:

該元件不被讀取由於缺乏命名空間規範的,我讀Need Help using XPath in ElementTree後得知。因此,下面的示例:

>>> import xml.etree.cElementTree as ET 
>>> for event, element in ET.iterparse("schema.xml"): 
...  if element.tag == "{http://www.domain.com/somepath/Schema}element": 
...  print element.text 
... 
findme 
findme2 
findme3 
findme4 
findme5 
findme6 
+0

您鏈接到的任何一個庫都可以。 – Patashu 2013-03-28 03:36:52

+0

我建議['cElementTree'](http://effbot.org/zone/celementtree.htm)通過'elementtree'模塊。它是經過編譯的C代碼,因此運行速度更快,使用更少的內存,但與'elementtree'具有非常類似的接口。 – 2013-03-28 03:45:39

回答

0

沒有看到你的XML文檔,我不能肯定,但我想你想要做的是:

的test.xml

<?xml version="1.0"?> 
<root> 
    <group> 
    <element>This is the first text</element> 
    </group> 
    <group> 
    <element>This is the second text</element> 
    </group> 
    <group> 
    <element>This is the third text</element> 
    </group> 
</root> 

test.py

import xml.etree.cElementTree as ET 

for event, element in ET.iterparse("test.xml"): 
    if element.tag == "element": 
     print element.text 

在終端中運行這些文件我得到:

[email protected]:~$ python test.py 
This is the first text 
This is the second text 
This is the third text 
+0

這是我正在尋找,雖然它沒有打印輸出。我已經用模式的例子更新了這個問題。 – Astron 2013-03-28 04:25:30

+0

@Astron - 您的更新不是有效的模式。 – 2013-03-28 19:19:24

+0

我的問題是命名空間的使用(有問題更新)。我怎樣才能在你的例子中處理命名空間? – Astron 2013-03-29 01:13:11