盲目解析特定标签的XML页面

时间:2014-06-12 03:34:18

标签: c++ xml xml-parsing tinyxml

我无法使用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() ? 老实说,我觉得有点迷失在这里,并感谢你们提供的任何帮助! 我想很快抓住这个机会,也感谢过去曾帮助过我这个网站的网站。 真是太神奇了。

感谢你的回复!

2 个答案:

答案 0 :(得分:0)

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

我一直在寻找的是接受()访客。我必须实例化访问者,添加他所遇到的任何特定效果"会产生,并把它扔进我的 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 parser 所以...是的。是的。
它显然 更好&现在比使用TinyXML-2解析HTML5更容易:D

答案 1 :(得分:-2)

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

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