我在名为'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字符串的更好方法?
答案 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文件的聪明,内存有效的方法。