gpt4 book ai didi

c++ - Xerces-c SaxParser 问题

转载 作者:行者123 更新时间:2023-11-28 05:57:04 25 4
gpt4 key购买 nike

我正在使用 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)。

有什么想法吗?

最佳答案

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

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

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

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

关于c++ - Xerces-c SaxParser 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33956165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com