Xerces-c SaxParser 问题

Xerces-c SaxParser issues

我正在使用 xerces-c 解析一个 XML 文件,但我得到了一些奇怪的结果。

我创建自己的 DocumentHandler(派生自 HandlerBase)并覆盖:

void characters(const XMLCh* const chars, const unsigned int length);

通过这种方式,我收到了元素内字符数据的通知。

为了解析文件,我创建了一个解析器,创建了一个输入缓冲区,创建了我的处理程序并调用了解析。

SAXParser* lp_parser = new SAXParser();

XMLCh* lp_fileName = XMLString::transcode("myfile.xml");
LocalFileInputSource l_fileBuf(lp_fileName);
XMLString::release(&lp_fileName);

MyHandler l_handler;

lp_parser->setDocumentHandler((DocumentHandler *)&l_handler);

lp_parser->parse(l_fileBuf);

delete lp_parser;

问题是 characters([...]) 不仅被调用了字符数据,而且(有时多次)为每个被调用的标签提供了一组空格和一个换行符作为字符数据。

<Tag>Value</Tag> 产生对 characters([...]) 的两次调用,一次调用的数据是 'Value',另一次(或多次)调用的数据类似于 ' \n '

xml 文件本身不包含这些字符。我让用户 xerces-c 像这样多次解析 XML,没有任何问题,尽管这是我第一次使用 LocalFileInputSource(我通常使用 MemBufInputSource)。

有什么想法吗?

我在使用 SAX2XMLReader 时遇到了类似的问题。我的理解是,使用 SAX 解析器时,开发人员可以在解析时知道他在 XML 结构中的位置。

随后对 characters() 的这些调用可能是针对文件中的其他标记或可忽略的空格。

根据数据的长度,也可能为同一标签多次调用回调字符。连接每次调用时收到的数据取决于您。

所以我要做的是使用回调函数 startElement() 和 endElement() 检测标记 <Tag> 的开始和结束。通过这种方式,您可以在收到标签的 endElement() 后放弃对 characters() 的后续调用。