2013-05-13 4 views
1

나는 함께 QtXmlQuery를 사용하여 QT와 HTML 페이지를 구문 분석하려고 해요 :qt를 사용하여 xml을 구문 분석하는 방법은 무엇입니까?

query.setFocus(qNetworkReply->readAll()); 

그러나 나는 다음과 같은 오류 메시지가 나타납니다

Error FODC0002 in tag:trolltech.com,2007:QtXmlPatterns:QIODeviceVariable:u, 
at line 3, column 44: Entity 'ndash' not declared. 

내가이 난 HTML 페이지를 의미한다고 생각을 읽으려고하면 형식이 잘못되었습니다. 페이지를 고치는 방법?

+3

문제는 HTML이 XML이 아니라는 것입니다. HTML 파서가 필요합니다. – Blender

+0

그래서 어떤 도구를 사용할 수 있습니까?어쩌면 나는 HTML을 가능한 한 많이 xhtml로 변환 한 다음 XML 도구를 사용하거나 다른 것을 사용해야합니까? 이것은 단순한 헤더 오류 xml 문제로 보이지만,이 ndash는 어디에서 왔으며 어떻게 해결할 수 있습니까? – shkra19

답변

0

먼저 ndash를 당신의 XML로 선언 된 경우 어쩌면 확인하십시오. "실체"

<!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;">] 

see here for more info

모든 다음 대안으로 다른 것을 시도 OK 인 경우 : 당신은 내장 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 
    } 
} 

당신은 또한 here

이 요소를 검색 할 몇 가지 wraper 찾을 수 있습니다

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"); 
+0

이미 QByteArray에 html이 있으면 잠깐 기다려주세요.이 모든 단계를 건너 뛸 수 있습니까? 상당히 많은 양의 코드 인 것 같습니다. 또한 Xpath를 사용하여 페이지의 일부를 검색하는 방법은 무엇입니까? QXmlQuery를 설정하려고하는데 초점을 설정할 때 언급 한 오류가 발생합니다. 어쩌면 setFocus 작업을하기 위해 페이지를 약간 변경할 수 있습니까? – shkra19

+0

잘 모르겠습니다.이 방법은 페이지를로드하는 방식으로 요소를 검색하는 방법을 참조하십시오. – 4pie0

+0

재미있을 것 같지만 많은 리팩터링을 사용하여 코드에 삽입해야합니다. 두 가지 솔루션을 결합하는 방법이있을 것이라고 확신하지만 QWebView를 실제로 알지 못합니다. 하지만 findAllElements는 어떤 복잡한 xpath와도 실제로 작동합니까? – shkra19

0

참고하는 XSLT에 대한 Qt는 문서 2.0에서는 XML 엔터티 만 지원된다고 분명히 말합니다.

The QtXmlPatterns implementation of the XPath Data Model does not include entities (due to QXmlStreamReader not reporting them). This means that functions unparsed-entity-uri() and unparsed-entity-public-id() always return negatively.

출처 : 그들은 (다니면서) 문제를 "해결"할 수있는 방법을 지정하지 http://doc.qt.io/qt-4.8/xmlprocessing.html#xslt-2-0

. 문제를 해결하는 한 가지 방법은 문서를 문자열로 읽고 모든 HTML 엔터티를 16 진수 구문으로 바꾸거나 심지어 해당 유니 코드 문자로 바꿔서 파서가 행복하게 만들 수 있습니다.

그것을 할 수 있지만, 점을 증명하기 위해 느린 방법 : 엔티티 어딘가에 정의하도록

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

더 좋은 방법이 될 것입니다,하지만 난 할 수있는 방법이 정말이 너무 잘 모르겠어요를 그.

QXmlStreamReader 자체에는 엔티티 리졸버를 설정하는 기능이 있지만, 그 클래스에 액세스 할 수있는 적이 없다고 생각합니다. 따라서 엔티티를 지원하지 않는 QtXmlPatterns에 대한 주석.

관련 문제