Python 使用XML.etree.cElementTree解析XML

Python 使用XML.etree.cElementTree解析XML,python,celementtree,Python,Celementtree,我在一个名为“XML”的字符串中包含以下XML: <?xml version="1.0" encoding="ISO-8859-1"?> <Book> <Page> <Text>Blah</Text> </Page> </Book> 元素现在等于元素,这是我想要的(无论如何,对于这个解决方案),但是如何从中获取内部文本呢?element.text不起作用。有什么想法吗 编辑:element.te

我在一个名为“XML”的字符串中包含以下XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<Book>
  <Page>
    <Text>Blah</Text>
  </Page>
</Book>
元素现在等于元素,这是我想要的(无论如何,对于这个解决方案),但是如何从中获取内部文本呢?element.text不起作用。有什么想法吗

编辑:element.text不提供任何内容

PS:我正在使用Python2.5ATM

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

请解释“不工作”对您意味着什么。我猜您运行(或应该运行)的代码是为我工作的(Python2.x for x in(5,6))——请参见下文。它甚至在Python2.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'
>>>
>xml=”“”\
... 
... 
...   
……废话
...   
... 
... """
>>>将xml.etree.cElementTree作为ET导入
>>>root=ET.fromstring(xml)
>>>元素=根。getchildren()[0]。getchildren()[0]
>>>element.tag
“文本”
>>>element.text
“废话”
>>>
也许你想改天再问你的额外问题,直到第一个问题解决为止;-)

请解释“不起作用”对你意味着什么。我猜您运行(或应该运行)的代码是为我工作的(Python2.x for x in(5,6))——请参见下文。它甚至在Python2.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'
>>>
>xml=”“”\
... 
... 
...   
……废话
...   
... 
... """
>>>将xml.etree.cElementTree作为ET导入
>>>root=ET.fromstring(xml)
>>>元素=根。getchildren()[0]。getchildren()[0]
>>>element.tag
“文本”
>>>element.text
“废话”
>>>
也许你想改天再问你的额外问题,直到第一个问题解决为止;-)

对于非海量的.xmls(可能只有几mb)来说,您这样做应该没问题,但是如果您知道标记并只想将值作为输出,我找到了一种方法,这主要是因为我对它进行了修改,但我需要它,甚至根本不需要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
path='yourxmlfilepath.xml'
tagyouwant='Headline'#举个例子,我想要在'Headline'标记之间的文本
opentag=''
closetag=''
打开(路径,'rb')作为输入文件:
对于inputfile中的行:
如果opentag在行中:
strtoget=str(行)
stroget=stroget.replace(opentag,“”)#从文本中修剪标记
stroget=stroget.replace(closetag,“”)
打印strotget
您可以使用现在拥有的字符串,而不是最终的print语句。或者,您也可以将其作为批处理或命令行运行,并将其输出到.txt,并在这样做时存储所有值(具体取决于您想用它做什么)

不管怎么说,我认为这是一种聪明、高效的方法来解析巨大的xml文件,因为您已经知道要从中得到什么。

对于非海量.xmls(可能只有几mb)来说,这样做应该很好,但如果您知道标记,只想将值作为输出,我找到了一种方法来实现这一点,这主要归功于,但根据我的需要对它进行了修改,甚至根本不需要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
path='yourxmlfilepath.xml'
tagyouwant='Headline'#举个例子,我想要在'Headline'标记之间的文本
opentag=''
closetag=''
打开(路径,'rb')作为输入文件:
对于inputfile中的行:
如果opentag在行中:
strtoget=str(行)
stroget=stroget.replace(opentag,“”)#从文本中修剪标记
stroget=stroget.replace(closetag,“”)
打印strotget
您可以使用现在拥有的字符串,而不是最终的print语句。或者,您也可以将其作为批处理或命令行运行,并将其输出到.txt,并在这样做时存储所有值(具体取决于您想用它做什么)


不管怎么说,我认为这是一种聪明、高效的方法来解析巨大的xml文件,而你已经知道你想要从中得到什么了。

好的,我不知道发生了什么变化,但我复制并粘贴了你的代码,它可以正常工作。这是一天的开始……好吧,我不知道发生了什么变化,但我复制并粘贴了你的代码,它可以正常工作。这是一个多么好的开始…那么问题出在哪里呢?好吧,我们有自己的IDE来模拟我们的prod环境。当我在调试模式下运行该代码时,它不起作用,但当我编译并执行它时,它工作得很好。所以我想这是我们的IDE中的一个bug。那么问题出在哪里呢?我们有自己的IDE来模拟我们的产品环境。当我在调试模式下运行该代码时,它不起作用,但当我编译并执行它时,它工作得很好。所以我想这是我们IDE中的一个bug。@Andre…谢谢你的评论,非常有建设性。据我所知,XML文件仍然很常见,而且这些问题仍然存在!因此,我遇到了这个问题,并认为其他人看到我如何解决它可能会有所帮助。@Andre…谢谢你的评论,非常有建设性。据我所知,XML文件仍然很常见,而且这些问题仍然存在!因此,我遇到了这个问题,并认为其他人看到我如何解决这个问题可能会有所帮助。