0

我在名为“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 字符串的更好方法是什么?

4

2 回答 2

4

请解释一下“不起作用”对您意味着什么。我猜你运行(或应该运行)的代码对我有用(Python 2.x 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'
>>>

也许您想对您的额外问题进行检查,直到我们解决第一个问题;-)

于 2010-06-10T09:39:19.880 回答
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

而不是最终的打印语句,您可以使用您现在拥有的字符串执行您想要的操作。或者,您也可以将其作为批处理或命令行运行并输出到 .txt 并在此过程中存储所有值(实际上取决于您想用它做什么)。

无论如何,当您已经确切知道要从中获得什么时,我认为这是一种解析大型 xml 文件的聪明、高效的内存方式。

于 2017-03-15T16:36:30.940 回答