2017-09-21 49 views
0

我已经阅读了一些堆栈上的响应,并试图解决这个问题一段时间。如何从Python中的elementTree使用findall从xml文档检索标记的数量

我希望能够以输出:

  • 具有相同标记的元素(比如foo,酒吧和类型)
  • 属性内的数字(如foobar的)

样品预计产出(或任何变化:

foo, 1 
bar, 2 
type, 8 

foobar, 10 
foobar, 20 

我试图做到这一点不使用rootchild节点方法。

XML文档

<first> 
    <foo> 
     <bar> 
     <type foobar="1"/> 
     <type foobar="2"/> 
     <type foobar="3"/> 
     <type foobar="4"/> 
     </bar> 
     <bar> 
     <type foobar="1"/> 
     <type foobar="2"/> 
     <type foobar="3"/> 
     <type foobar="4"/> 
     </bar> 
    </foo> 
</first> 

Python代码

import xml.etree.ElementTree as ET 
fname = 'Library4.xml' # handle 
stuff = ET.parse(fname) 

for atype in stuff.findall('type'): 
    print(atype.get('foobar')) 

all  = stuff.findall('bar') 
print('bar', all) 

all  = stuff.findall('foo') 
print('foo', all) 

输出我得到:

bar [] 
foo [<Element 'foo' at 0x000001E3C71F8B38>] 

快乐,以进一步澄清。感谢任何帮助,指出我的错误和错误。谢谢。

+0

你能否也把你所期望的输出? –

+0

@ChetanVasudevan是的,我编辑并澄清了我希望得到的输出。谢谢。 –

回答

0

因此,您可以使用类似下面的代码并计算外观,请按照下面的代码作为示例。

from xml.dom import minidom 
    fname = 'library4.xml' 
    xmldoc = minidom.parse('library4.xml') 
    print("type " + str(len(xmldoc.getElementsByTagName('type')))) 
    print("foo " + str(len(xmldoc.getElementsByTagName('foo')))) 
    print("bar " + str(len(xmldoc.getElementsByTagName('bar')))) 

和输出,这是如下:

type 8 
    foo 1 
    bar 2 
+0

@凯恩咀嚼,这是你在找什么? –

+0

我看到一些使用'minidom'的堆栈文章。但我试图直接使用解析和findall来做到这一点。网上资源似乎表明这是可能的,但我弄清楚如何。 https://docs.python.org/3/library/xml.etree.elementtree.html,在20.5.3下。参考文献 20.5.3.1。功能 –

相关问题