我无法使用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() ? 老实说,我觉得有点迷失在这里,并感谢你们提供的任何帮助! 我想很快抓住这个机会,也感谢过去曾帮助过我这个网站的网站。 真是太神奇了。
感谢你的回复!
答案 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一无所知,因此我无法建议如何解决现有代码中的问题。)