c++ - XML 解析问题

标签 c++ xml

我有一个 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++ 编程。

请帮忙。

最佳答案

简短回答:你做错了。

您的问题混淆了两个不同的问题:

  1. 解析完全不是格式良好的 XML 的数据,即所谓的标签汤。

    示例:由不了解 XML 或编码实践糟糕的程序员生成的文件。

    • 可以这样说:格式不正确的 XML 文件根本不是 XML 文档。每个正确的 XML 解析器都会拒绝它。理想情况下,您会努力更正此数据的来源并确保生成正确的 XML。

    • 或者,使用标记汤解析器,即进行纠错的解析器。

      有用的标签汤解析器通常实际上是 HTML 解析器。 tidy已经在另一个答案中指出了。

      确保您了解此类解析器实际执行的校正步骤,因为没有可以修复 XML 的通用方法。例如,Tidy 在“修复”数据方面非常积极,比真正的浏览器和 HTML 5 规范更积极。

  2. 从套接字解析 XML,其中数据以流的形式逐 block 到达。在这种情况下,XML 文档可能被视为“无限”,在看到根元素的最终结束标记之前很久就开始处理 block 。

    示例:XMPP 是这样工作的协议(protocol)。

    • 解决方案是使用拉式解析器,例如 XMLTextReader libxml2 中的 API。

    • 如果要解析的 XML 子元素需要基于树的数据结构,您可以为正在读取的每个此类元素构建树结构,而不是为整个文档构建树结构。

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

相关文章:

C++私有(private)嵌套类——访问不同的函数

c# - 如何使用正则表达式清理 XML 属性?

android - 如何将矢量路径转换为图像以及反之亦然

c++ - 如何删除字符串中的字符?

c++ - 有没有什么方法可以在用户输入文本时读取字符?

c++ - 如何OPENCV + CUDA + VideoCapture?

c++ - 从多个类共享对成员变量的访问

xml - 覆盖默认的 ImageMagick policy.xml

python - IronPython 和 xml.etree.ElementTree 非法字符错误

xml - 如何使用 XSLT 转换已转换的 XML