【问题标题】:Parsing invalid XML in C++ [duplicate]在 C++ 中解析无效的 XML [重复]
【发布时间】:2012-04-09 09:18:12
【问题描述】:

我一直在尝试从我的 C++ 代码中解析一些 html。我试过 RapidXML、TinyXML 和 Xerces。前两个给了我解析错误(我试图解析的代码已损坏:一些 <> 未关闭),而在我调用 getDocumentRoot() 后 Xerces 返回 null。

当您必须解析损坏的代码时,如何处理这些情况?是否有一些库可以解决这类问题?

【问题讨论】:

  • 如果您发布任何相关代码,无论是 c++ 还是 XML,都会有所帮助。
  • 或许可以尝试使用 HTML 解析器?
  • 如何进行取决于您想要发生的事情。所以 XML 无效。你想怎么解决?您不能指望解析器修复会做出太多假设的问题,因此您需要指定在找到损坏的文档时想要发生的事情。
  • HTML 不是 XML。从来没有,以后也不会。您永远不会得到现成的 XML 解析器来正确解析 HTML。另一方面,XHTML 确实符合 XML 标准,并且可以被任何半体面的 XML 解析器解析。
  • 好吧,最后我想解析一个文件,修改一些属性和内容,然后保存到另一个文件中。我刚刚尝试用 htmlcxx 解析它。解析时没有错误,但我无法将其保存回文件中。

标签: c++ xml xml-parsing xerces-c


【解决方案1】:

xerces-c 像许多其他的一样使用异常。

如果您想拥有一个强大的 xml 解析器,请大量使用捕获抛出的异常。许多异常类都有附加信息,因此您可以使用它们来创建一个真正健壮且“宽容”的 xml 解析器。

SAX 也是一个很好的起点。

xerces-c 中的示例 DOM 解析器(我最喜欢的解析器):

XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true);

ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);

char* xmlFile = "test.xml";

try
{
     parser->parse(xmlFile);
}
catch (const XMLException& toCatch)
{
     /*ERROR HANDLER*/
}
catch (const DOMException& toCatch)
{
     /*ERROR HANDLER*/
}
catch (...)
{
     /*ERROR HANDLER*/
}

delete parser;
delete errHandler;

此外,您还可以创建自己的 DOMErrorHandler 以即时进行“更正”。请参阅xerces-c programming guide 了解更多信息。

【讨论】:

    【解决方案2】:

    首先,如果 XML 被破坏(就像 HTML 一样),那么使用 DOM 解析器绝对不是正确的方法。如果您使用基于事件的解析器,例如 SAX(例如 expat、Xerces 等),您可能会有更好的运气。

    如果做不到这一点,为什么不将 HTML 解析器从 Webkit 中拉出来并挂钩。它将非常容错,如果我没记错的话,它是基于事件的,所以应该不会太难。

    【讨论】:

      【解决方案3】:

      你试过this one吗?我找到了最简单、最高效的 c++ xml 解析器之一...也许它可以帮助您解决问题。

      【讨论】:

        猜你喜欢
        • 2017-09-07
        • 2013-01-06
        • 1970-01-01
        • 2012-04-14
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多