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() 的后续调用。
我正在使用 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() 的后续调用。