【问题标题】:Parsing XML using xml.etree.cElementTree使用 xml.etree.cElementTree 解析 XML
【发布时间】:2010-06-10 09:17:38
【问题描述】:

我在名为“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 现在等于元素,这是我想要的(无论如何对于这个解决方案),但是我如何从中获取内部文本? element.text 不起作用。有什么想法吗?

编辑:element.text 给我 None

PS:我使用的是 Python 2.5 atm。

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

【问题讨论】:

  • 那么问题出在哪里?
  • 好吧,我们有自己的 IDE 来模拟我们的 prod 环境。当我在调试模式下运行该代码时它不起作用,但是当我编译并执行它时它工作正常。所以我猜这是我们 IDE 中的一个错误。

标签: python celementtree


【解决方案1】:

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

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

【讨论】:

  • 好的,我不知道发生了什么变化,但是我复制并粘贴了您的代码,它可以正常工作。多么美好的一天……
【解决方案2】:

对于非大量的 .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 文件的聪明、高效的内存方式。

【讨论】:

  • @Andre ...感谢您的评论,非常有建设性。据我所知,XML 文件仍然很常见,并且存在这些问题!因此,为什么我遇到了这个问题,并认为这可能对其他人有帮助,看看我是如何解决它的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2015-10-09
  • 2012-01-20
相关资源
最近更新 更多