1

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

4

2 回答 2

0

首先可能检查是否在您的 xml 中声明了 ndash:

<!ENTITY ndash "&#8211;"> <!-- en dash, U+2013 ISOpub --> 
<!ENTITY mdash "&#8212;"> <!-- em dash, U+2014 ISOpub --> 

命名实体,在 XML 规范中也称为内部实体,是您在谈论“实体”时通常所指的内容。您可以在 DTD 或内部子集(即,作为文档中声明的一部分)中声明它们,并在文档中将它们用作参考。在 XML 文档解析期间,实体引用被其表示替换。用简单的英语来说,这些实体只是在您处理文档时得到扩展的宏。

例子:

<!DOCTYPE article PUBLIC "-//NLM//DTD Journal
Publishing DTD v3.0 20080202//EN" "journalpublishing3.dtd"
[<!ENTITY ndash "&#x2013;">]

看到这里了解更多信息

如果一切正常,那么也可以尝试其他方法:您可以使用内置的 QtWebKit。例子:

class MyPageLoader : public QObject
{
  Q_OBJECT

public:
  MyPageLoader();
  void loadPage(const QUrl&);

public slots:
  void replyFinished(bool);

private:
  QWebView* m_view;
};

MyPageLoader::MyPageLoader()
{
  m_view = new QWebView();

  connect(m_view, SIGNAL(loadFinished(bool)),
          this, SLOT(replyFinished(bool)));
}

void MyPageLoader::loadPage(const QUrl& url)
{
  m_view->load(url);
}

void MyPageLoader::replyFinished(bool ok)
{
  QWebElementCollection elements = m_view->page()->mainFrame()->findAllElements("a");

  foreach (QWebElement e, elements) {
    // Process element e
  }
}

使用类

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");
于 2013-05-13T00:24:39.740 回答
0

请注意,关于 XSLT 2.0 的 Qt 文档明确指出仅支持 XML 实体。

XPath 数据模型的 QtXmlPatterns 实现不包括实体(由于 QXmlStreamReader 不报告它们)。这意味着函数 unparsed-entity-uri() 和 unparsed-entity-public-id() 总是返回负数。

来源:http ://doc.qt.io/qt-4.8/xmlprocessing.html#xslt-2-0

他们没有指定“解决”(解决)问题的方法。解决此问题的一种方法是将文档作为字符串读取,并将所有 HTML 实体替换为十六进制语法,甚至替换为相应的 Unicode 字符,这样解析器就会满意。

一种缓慢的方法,但要证明这一点:

doc.replace("&ndash;", QChar(8211));

更好的方法是在某处定义实体,但我不太确定是否真的有办法做到这一点。

请注意,QXmlStreamReader本身具有设置实体解析器的功能,但我认为您无法访问该类。因此,关于 QtXmlPatterns 不支持实体的评论。

于 2015-10-31T03:23:04.877 回答