解析C+中的无效XML+; 我一直试图从我的C++代码中解析一些HTML。我试过RapidXML、TinyXML和Xerces。前两个给了我解析错误(我试图解析的代码被破坏:一些没有关闭),而Xerces在我调用getDocumentRoot()后返回null

解析C+中的无效XML+; 我一直试图从我的C++代码中解析一些HTML。我试过RapidXML、TinyXML和Xerces。前两个给了我解析错误(我试图解析的代码被破坏:一些没有关闭),而Xerces在我调用getDocumentRoot()后返回null,c++,xml,xml-parsing,xerces-c,C++,Xml,Xml Parsing,Xerces C,在这些情况下,当您必须解析损坏的代码时,如何继续?有一些库可以解决这类问题吗?首先,如果XML被破坏(通常是HTML),那么使用DOM解析器肯定不是解决的方法。如果您使用基于事件的解析器,如SAX(如expat、Xerces等),您可能会有更好的运气 如果做不到这一点,为什么不将HTML解析器从Webkit中拉出来,并挂接到Webkit中呢。它将是非常容错的,如果我没记错的话,它是基于事件的,所以应该不会太难 xerces-c像许多其他程序一样使用异常 如果您想拥有一个健壮的xml解析器,请大量

在这些情况下,当您必须解析损坏的代码时,如何继续?有一些库可以解决这类问题吗?

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


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

xerces-c像许多其他程序一样使用异常

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

SAX也是一个很好的起点

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


此外,您还可以创建自己的DOMErrorHandler来动态地进行“更正”。有关详细信息,请参阅。

您尝试过吗?我发现了C++中最简单有效的XML解析器之一。也许它可以帮助你解决问题。

如果你发布了相关的代码,无论是C++还是XML,都会有帮助。也许试试使用HTML解析器吧。如何继续下去取决于你想要发生什么。因此,XML是无效的。你想怎么修?您不能期望解析器修复会产生太多假设的问题,因此您需要指定在发现损坏的文档时希望发生什么。HTML不是XML。从来没有,将来也不会。您永远不会得到现成的XML解析器来正确解析HTML。另一方面,XHTML确实符合XML标准,并且可以被任何半正派的XML解析器解析。好吧,最后我想解析一个文件,修改一些属性和内容,并将其保存在另一个文件中。我刚刚尝试用htmlcxx解析它。我在解析它时没有错误,但无法将其保存回文件中。
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;