盲目地解析XML页面以查找特定的标记

Blindly parse XML page for specific tags

本文关键字:查找 XML 盲目      更新时间:2023-10-16

我在使用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(),甚至兄弟姐妹…但是每次它都会导致分割故障,这是我无法理解的。

我已经读到Xpath将是完成我正在尝试做的事情的好方法,但是我又一次没有时间了,我担心我无法在这么短的时间内把我的思想集中在Xpath上。

我可能正在看所有错误的方式,或者我应该使用Accept() ?
老实说,我在这里感到有点失落,我会很感激你们提供的任何帮助!
我想迅速利用这个机会也感谢这个网站在过去帮助了我这么多。不可思议。

提前感谢您的回复!

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

我正在寻找的确实是Accept()Visitors。我必须实例化一个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 = ""; }

…然后返回一个经典的 MyVisitor::getTitle()函数,你可以在任何你需要的地方调用它。
希望它有帮助,如果有人想要更多的细节,我可以提供工作& &;扩展代码。

我已经发现Google发布了gumbo解析器所以…是的。
显然都更好&比使用TinyXML-2解析HTML5更容易:D

您可能想要考虑使用一个解析器,它可以提供更好的示例,您可以将其作为工具的基础…例如,Apache Xerces-C的SAX API示例可以被改编。

(我对TinyXML2和它支持的api一无所知,所以我不能建议你如何在现有的代码中修复这个问题。)