Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何用qt解析xml?_C++_Html_Xml_Qt - Fatal编程技术网

C++ 如何用qt解析xml?

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页面格式不正确。如

我正在尝试使用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页面格式不正确。如何修复页面?

首先,可能需要检查ndash是否在xml中声明:

<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub --> 
<!ENTITY mdash "&#8212;"> <!-- 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("&ndash;", 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("&ndash;", QChar(8211));