2012-11-22 92 views
0

我想解析使用Python的XML文件。由于XML的大小,我想使用Pull Parser。我找到了this之一。Python的XML解析器

我的代码开始与

doc = pulldom.parse("myfile.xml") 
for event, node in doc: 
    # code here... 

我使用

if (node.localName == "b"): 

获取XML标签名,并能正常工作。

我无法找到如何做是从标签之间获取文本。使用node.nodeValue返回None

我可以使用node.toxml()来获取节点的完整XML,但我只想要标记之间的文本。有没有办法做到这一点,而不是使用正则表达式替换从node.toxml()中取出标签?

+1

'ElementTree' API提供了一个流式变体(标准库和'lxml'实现了它)。你可能想看看,并使用结束事件来获取文本。 –

+0

如果你可以切换到'ElementTree'看看这个http://blog.doughellmann.com/2010/03/pymotw-parsing-xml-documents-with.html。它解决了你的问题 – Netro

回答

1

对于每个带有文本的标记,您有两个节点,本地名称为“b” - START_ELEMENTEND_ELEMENT。通常情况下,您应该收到类似这样的内容:

START_ELEMENT 
CHARACTERS 
END_ELEMENT 

因此,您正在查找匹配的开始元素之后的字符。你可能想尝试这样的事:

from xml.dom.pulldom import CHARACTERS, START_ELEMENT, parse 

doc = parse("myfile.xml") 
text_expected = False 
for event, node in doc: 
    print event, node 
    if text_expected: 
     text_expected = False 
     if event != CHARACTERS: 
      # strange .. there should be some 
      continue 
     print node.data 
    else: 
     text_expected = (event == START_ELEMENT) and (node.localName == "b") 

有了这个myfile.xml

<a> 
    <b>c1</b> 
    <b>c2</b> 
</a> 

我得到的输出

c1 
c2 

请注意,您可能需要strip()每个字符串必须忽略每隔一个CHARACTERS -event。两个元素之间的每个换行符和空白都会生成一个CHARACTERS事件。