我正在使用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([...])的调用,一个调用数据为“值”,另一个调用(或多个),其中的数据类似于“类似于”的“类似的”
xml文件本身不包含这些字符。虽然这是我第一次使用LocalFileInputSource (我通常使用MemBufInputSource),但我有用户xerces-c来像这样多次解析XML,没有任何问题。
有什么想法吗?
发布于 2016-02-10 08:25:40
我对SAX2XMLReader也有类似的问题。我理解的是,在使用SAX解析器时,开发人员在解析时应该知道他在XML结构中的位置。
这些对字符()的后续调用可能用于文件中的其他标记或可忽略的空格。
根据数据的长度,还可能为同一个标记多次调用回调字符。这取决于您连接您在每个电话中接收到的数据。
因此,我要做的是用回调函数startElement()和endElement()检测标记endElement的开始和结束。这样,一旦收到标记的endElement(),就可以放弃对字符()的后续调用。
https://stackoverflow.com/questions/33956165
复制相似问题