我有一个 XML 解析器在处理不完整的 XML 数据时崩溃。因此,提供给它的 XML 数据可能是以下之一:
<one><two>twocontent</two</one>
<a/><b/> ( the parser treats it as two root elements )
元素属性也被处理(虽然上面没有显示)。
现在,问题是当我从套接字读取数据时,我得到的是片段数据。例如:
<one>one
content</two>
</one>
因此,在将 XML 发送到解析器之前,我必须构造一个有效的 XML 并将其发送。 哪种编程结构(如迭代、递归等)最适合这种情况。
我正在用 C++ 编程。
请帮忙。
最佳答案
简短回答:你做错了。
您的问题混淆了两个不同的问题:
解析完全不是格式良好的 XML 的数据,即所谓的标签汤。
示例:由不了解 XML 或编码实践糟糕的程序员生成的文件。
可以这样说:格式不正确的 XML 文件根本不是 XML 文档。每个正确的 XML 解析器都会拒绝它。理想情况下,您会努力更正此数据的来源并确保生成正确的 XML。
或者,使用标记汤解析器,即进行纠错的解析器。
有用的标签汤解析器通常实际上是 HTML 解析器。 tidy已经在另一个答案中指出了。
确保您了解此类解析器实际执行的校正步骤,因为没有可以修复 XML 的通用方法。例如,Tidy 在“修复”数据方面非常积极,比真正的浏览器和 HTML 5 规范更积极。
从套接字解析 XML,其中数据以流的形式逐 block 到达。在这种情况下,XML 文档可能被视为“无限”,在看到根元素的最终结束标记之前很久就开始处理 block 。
示例:XMPP 是这样工作的协议(protocol)。
解决方案是使用拉式解析器,例如 XMLTextReader libxml2 中的 API。
如果要解析的 XML 子元素需要基于树的数据结构,您可以为正在读取的每个此类元素构建树结构,而不是为整个文档构建树结构。
关于c++ - XML 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/564367/