【问题标题】:Blindly parse XML page for specific tags盲目地解析特定标签的 XML 页面
【发布时间】:2014-08-02 06:50:37
【问题描述】:

我在使用TinyXML2盲目地解析特定标签的XML 页面时遇到问题。

基本上,我被要求通过 C++ 解析 HTML 页面。我使用(相当旧的)tidyHTML 库首先将我的 HTML 页面“翻译”成 XML 页面。然后,我想使用 TinyXML2 来解析这些新创建的 XML 页面以获取 特定标签的内容(标题、h1、元关键字,...)。

为此,我尝试使用以下代码遍历我的 XML 页面中的所有标签:

XMLDocument doc;
doc.Parse( cleanedHTML.c_str() );
XMLNode* currentNode;

if(currentNode->NoChildren())
{
    while(!currentNode->NextSibling())
    {
        currentNode=currentNode->Parent();
        if(!currentNode)
            return NULL;
    }
    currentNode=currentNode->NextSibling();
}
else
{
    currentNode=currentNode->FirstChild();
}

doc.Print();
std::string nodeName = currentNode->LastChild()->Value();
return nodeName;

这段代码可能有一些问题 - 毫无疑问,我显然是个业余爱好者。但结果仍然让我感到困惑:无论我在解析哪个页面,nodeName 都会返回“USER=root”。

我尝试选择此节点的相关元素,例如 currentNode->FirstChildElement()LastChildElement(),甚至是 Siblings...但每次它都会导致 分段错误。

我读到 Xpath 将是做我想做的事情的好方法,但是我又一次没时间了,我担心我做不到在如此相对较短的时间内将我的思想包裹在 Xpath 上。

我可能看错了,或者我应该使用 Accept() 吗?
老实说,我在这里感到有些失落,并希望你们能提供任何帮助!
我想迅速借此机会也感谢这个网站,它在过去的。 真是太棒了。

提前感谢您的回复!

【问题讨论】:

  • 您是否验证过“已清理”的 XML 实际上是 有效 XML?
  • 嗯,我首先尝试使用一个非常简单的代码(6 个元素和十几个节点顶部),然后...... xmlvalidation.com 没有遇到任何错误。我现在将尝试类似地解析,但只解析 ELEMENTS 并通过 FOR 循环。

标签: c++ xml xml-parsing tinyxml


【解决方案1】:

现在我已经完成了我的项目,我终于可以回答这个问题了:

我正在寻找的确实是 Accept()Visitor。我必须实例化一个访客,添加他的“遭遇”会产生的任何特定效果,然后将其放入我的 doc.Accept();

例如,如果我想在字符串中获取已解析页面的标题,我会这样做:

bool MyVisitor::VisitEnter(const XMLElement& element, const XMLAttribute* attribute) if(strcmp( element.Name(), "title") == 0) { if(element.GetText() != NULL) { titleContent = element.GetText(); } else titleContent = ""; }

... 然后用一个 classic MyVisitor::getTitle() 函数返回它,您可以在需要它的任何地方调用它。
希望它有所帮助,如果有人想要更多详细信息,我可以提供工作和扩展代码。

我后来发现 Google 发布了 gumbo parser 所以...是的。
显然比现在使用 TinyXML-2 解析 HTML5 更好也更容易:D

【讨论】:

    【解决方案2】:

    您可能需要考虑使用一个解析器,该解析器可以提供更好的示例,您可以在此基础上构建您的工具...例如,可以调整 Apache Xerces-C 的 SAX API 示例。

    (我对 TinyXML2 及其支持的 API 一无所知,因此无法建议如何解决现有代码中的问题。)

    【讨论】:

    • 感谢您的关注!我认为 TinyXML2 已经具有接近 SAX 接口 (Accept()) 的功能,但是……这真的是我想要做的吗?无论如何,我都会对 SAX 进行更多研究。
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多