【问题标题】:Python XML Pull ParserPython XML 拉解析器
【发布时间】:2012-11-22 14:58:25
【问题描述】:

我正在尝试使用 Python 解析 XML 文件。由于 XML 的大小,我想使用 Pull Parser。我找到了this 一个。

我的代码以

开头
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() 中取出之外,还有其他方法吗?

【问题讨论】:

  • ElementTree API 提供了一个流变体(标准库和lxml 实现都有它)。您可能想要查看它并使用结束事件来获取文本。
  • 如果你可以切换到ElementTree,看看这个blog.doughellmann.com/2010/03/…。它解决了你的问题

标签: python xml xml-parsing xmlpullparser


【解决方案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-event。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多