使用 tinyxml2(或其他 C++ XML 库)查找 XML 元素 'start' 和 'end'

Find XML element 'start' and 'end' using tinyxml2 (or other C++ XML library)

我正在尝试遍历 XML 文档的元素,并在 'start' 元素和 'end' 元素上触发事件。

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

Using Python's xml.etree to find element start and end character offsets

#!/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,因为它是 'tiny',但我愿意接受其他 C++ XML 库,如果它们可以实现这一目标(更容易)。

如果有更好的方法在 'end tags' 上触发事件,我也愿意接受。

tinyXml2 offers a very basic(and very fast) implementation to parser and navigate inside a xml structure. RapidXML 可能更快,但具有相同的基本行为。

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