C++ 如何用qt解析xml?
我正在尝试使用QtXmlQuery解析带有qt的html页面,使用:C++ 如何用qt解析xml?,c++,html,xml,qt,C++,Html,Xml,Qt,我正在尝试使用QtXmlQuery解析带有qt的html页面,使用: query.setFocus(qNetworkReply->readAll()); 但我收到以下错误消息: Error FODC0002 in tag:trolltech.com,2007:QtXmlPatterns:QIODeviceVariable:u, at line 3, column 44: Entity 'ndash' not declared. 我想这意味着我试图阅读的html页面格式不正确。如
query.setFocus(qNetworkReply->readAll());
但我收到以下错误消息:
Error FODC0002 in tag:trolltech.com,2007:QtXmlPatterns:QIODeviceVariable:u,
at line 3, column 44: Entity 'ndash' not declared.
我想这意味着我试图阅读的html页面格式不正确。如何修复页面?首先,可能需要检查ndash是否在xml中声明:
<!ENTITY ndash "–"> <!-- en dash, U+2013 ISOpub -->
<!ENTITY mdash "—"> <!-- em dash, U+2014 ISOpub -->
使用该类
MyPageLoader loader;
loader.loadPage("http://www.google.com")
你也可以找到一些包装纸
要检索元素,请执行以下操作:
QWebView* view = new QWebView(parent);
view.load(QUrl("http://www.your_site.com"));
QWebElementCollection elements = view.page().mainFrame().findAllElements("a");
请注意,有关XSLT2.0的Qt文档清楚地表明,只支持XML实体 XPath数据模型的QtXmlPatterns实现不包括实体,因为QXmlStreamReader没有报告实体。这意味着函数unparsed entity uri和unparsed entity public id始终返回负值 资料来源: 他们没有指定解决问题的方法。解决此问题的一种方法是将文档作为字符串读取,并将所有HTML实体替换为十六进制语法,甚至替换为相应的Unicode字符,这样解析器就会满意 这是一种缓慢的方法,但为了证明这一点:
doc.replace("–", QChar(8211));
更好的方法是在某处定义实体,但我不确定是否真的有这样做的方法
请注意,它本身有一个设置实体解析器的函数,但我认为您永远无法访问该类。因此,关于QtXmlPatterns不支持实体的评论。您的问题是HTML不是XML。你需要一个HTML解析器。那么我可以使用什么工具呢?也许我可以尽可能多地使用一个工具将html转换成xhtml,然后使用xml工具,或者我应该使用不同的工具吗?这似乎只是一个简单的头错误xml问题,这个ndash是从哪里来的,如何解决这个问题?等等,如果我已经在QByteArray中有了html,我可以跳过所有这些步骤吗?这似乎是一个相当大的代码量。另外,如何使用Xpath检索页面的一部分,这是我首先要查找的内容?我试图设置一个QXmlQuery,但我在尝试设置其焦点时遇到了我提到的错误。也许我可以稍微修改一下页面以使setFocus正常工作?我不确定,这是一种加载页面的方法,请参见编辑如何检索元素。这似乎很有趣,但将其插入到我自己的代码中需要进行大量重构。我确信有一种方法可以将我们的两种解决方案结合起来,但我并不真正了解QWebView。但是findAllElements真的可以处理任何复杂的xpath吗?我没有尝试过,但这可能只有在从web加载HTML时才有效。我懂了。但我只是看了findAllElements,它只处理CSS路径,而不是一般的xpath。我真的希望像处理xml文档一样处理我的页面。你知道如何将我的html翻译成兼容xhtml的格式,或者只是解决我在问题中提到的问题吗?我肯定这只是一个愚蠢的标题问题,但我不理解错误消息
QWebView* view = new QWebView(parent);
view.load(QUrl("http://www.your_site.com"));
QWebElementCollection elements = view.page().mainFrame().findAllElements("a");
doc.replace("–", QChar(8211));