【问题标题】:Xerces-c SaxParser issuesXerces-c SaxParser 问题
【发布时间】:2015-11-27 11:15:03
【问题描述】:

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

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

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

这样我会收到元素内字符数据的通知。

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

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([...]) 的调用,一个是数据是“值”,另一个是(或多个)数据类似于“     \n                   ”

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

有什么想法吗?

【问题讨论】:

  • 看起来解析器正在给我提供“可忽略的空白”,但到目前为止我一直无法找到如何阻止它。我发现的一个建议是“验证解析器”不会将这些发送到“字符([...])”,而是发送到“ignorableWhitespace([...])”,但到目前为止我还没有让它工作。

标签: c++ xml xerces-c


【解决方案1】:

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

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

根据数据的长度,也有可能为同一个标签多次调用回调字符。您可以将每次通话收到的数据连接起来。

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

【讨论】:

  • 是的,这也是我选择“修复”这个问题的方式。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多