0

我一直在尝试从我的 C++ 代码中解析一些 html。我试过 RapidXML、TinyXML 和 Xerces。前两个给了我解析错误(我试图解析的代码被破坏:有些<>没有关闭),而 Xerces 在我调用getDocumentRoot().

当您必须解析损坏的代码时,如何在这些情况下进行?是否有一些图书馆可以解决这类问题?

4

3 回答 3

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 编程指南

于 2012-05-14T16:40:18.510 回答
0

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

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

于 2012-03-25T17:57:04.677 回答
0

你试过这个吗?我找到了最简单、最有效的 C++ xml 解析器之一……也许它可以帮助您解决问题。

于 2012-05-14T16:53:36.973 回答