1

我正在尝试遍历 XML 文档的元素,并在“开始”元素和“结束”元素上触发事件。

这在使用 Python 的 lxml 模块时非常简单,甚至还有另一个关于 SO 的问题:

使用 Python 的 xml.etree 查找元素开始和结束字符偏移量

#!/usr/bin/python
import re, sys
from lxml import etree
from StringIO import StringIO

dtd = etree.DTD (open (sys.argv [1], "r"))
xml = etree.XML (open (sys.argv [2], "r").read ())

result = dtd.validate (xml)
for error in dtd.error_log.filter_from_errors():
    print(error.message)
    print(error.line)
    print(error.column)

if result == True :
    for event, elem in etree.iterwalk (xml, events=('start', 'end')) :
        if event == 'start' :
            print 'starting element:', elem.tag
        elif event == 'end' :
            print 'ending element:', elem.tag
            if elem is not xml :
                print elem.tail

我想使用 tinyxml2 C++ XML 库做同样的事情,但到目前为止我还没有运气[特别是找到结束标签]。

我更喜欢 tinyxml2,因为它“很小”,但如果其他 C++ XML 库能够实现这一目标(更容易),我愿意接受。

如果有更好的方法来触发“结束标签”上的事件,我也对此持开放态度。

4

1 回答 1

0

tinyXml2提供了一个非常基本(并且非常快速)的实现来解析和在 xml 结构中导航。RapidXML可能更快,但它具有相同的基本行为。

我建议如果是强制捕获事件(开始和结束),请使用 Xerces,因为 SAXParser 允许在解析器位于 xml 元素内以及当它也从元素退出时进行捕获。在我看来,最大的不便是在 MSVC 下编译,因为你必须在 C++ 中编译 apache commons,所以非常乏味,但在 gcc 环境下我认为比较微不足道。祝你好运!

于 2015-06-05T09:45:06.223 回答