使用xml.etree.cElementTree解析XML

时间:2010-06-10 09:17:38

标签: python celementtree

我在名为'xml'的字符串中有以下XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Book>
  <Page>
    <Text>Blah</Text>
  </Page>
</Book>

我正试图从中获取Blah的价值,但我遇到了xml.etree.cElementTree的问题。我已经尝试过find()和findtext()方法,但没有。最终我这样做了:

import xml.etree.cElementTree as ET
...
root = ET.fromstring(xml)
element = root.getchildren()[0].getchildren()[0]

元素现在等于元素,这就是我想要的(无论如何这个解决方案),但是如何从中获取内部文本? element.text不起作用。有什么想法吗?

编辑:element.text给我无

PS:我使用的是Python 2.5 atm。

作为一个额外的问题:什么是在python中解析xml字符串的更好方法?

2 个答案:

答案 0 :(得分:3)

请解释一下“不起作用”对您意味着什么。我猜你运行(或者应该运行)的代码对我有用(Python(2.)for x in(5,6)) - 见下文。它甚至适用于Python 2.1,并对import语句进行了适当的更改。请注意,我显示element.tag表示它指的是所需的元素。

>>> xml = """\
... <?xml version="1.0" encoding="ISO-8859-1"?>
... <Book>
...   <Page>
...     <Text>Blah</Text>
...   </Page>
... </Book>
... """
>>> import xml.etree.cElementTree as ET
>>> root = ET.fromstring(xml)
>>> element = root.getchildren()[0].getchildren()[0]
>>> element.tag
'Text'
>>> element.text
'Blah'
>>>

也许你想对你的额外问题进行雨水检查,直到我们得到第一个问题; - )

答案 1 :(得分:0)

对于非大规模.xmls(可能是几mb),你的方式应该没问题,但如果你知道标签并且只想将值作为输出,我找到了一种方法来做到这一点,主要是因为http://enginerds.craftsy.com/blog/2014/04/parsing-large-xml-files-in-python-without-a-billion-gigs-of-ram.html但是根据我的需要对其进行了修改,甚至根本不需要xml.etree。例如:

path = 'yourxmlfilepath.xml'
tagyouwant='Headline' #just an example, i wanted the text between 'Headline' tags
opentag='<'+tagyouwant+'>'
closetag='</'+tagyouwant+'>'

with open(path,'rb') as inputfile:
    for line in inputfile:
        if opentag in line:
            strtoget=str(line)
            strtoget=strtoget.replace(opentag,"") #trimming the tags from the text
            strtoget=strtoget.replace(closetag,"")
            print strtoget

而不是最终的print语句,您可以使用现有的字符串执行所需的操作。或者,您也可以将其作为批处理或命令行运行并输出到.txt并按照这种方式存储所有值(实际上取决于您要对其执行的操作)。

无论如何,当你确切地知道你想要从中获取它时,我认为这是一种解析大型xml文件的聪明,内存有效的方法。