首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用HTML5解析QXmlQuery

用HTML5解析QXmlQuery
EN

Stack Overflow用户
提问于 2017-01-24 07:05:07
回答 1查看 576关注 0票数 0

我想使用QT在许多HTML5文档上运行一些HTML5(现在是5.8)。现在,HTML/HTML 5文档(与XHTML/XHTML 5不同)不是格式良好的XML文档。HTML带来了许多不能立即用XML解析器解析的元素(只有在html +自关闭标记+.中才能找到特殊字符)。

我尝试使用了许多html“整齐”实用程序,包括在线服务和著名的htmltidy.org二进制文件,它们确实很整洁,但仍然没有形成一个格式良好的XML!

所以问题是:

  1. 这里有我缺少的另一种专用HTML解析器吗?
  2. 是否有任何经过验证的HTML5 5-> XML转换器(我不在乎XML是否包含任何“有问题的”字符/标记。我只需要信息.
  3. HTML/HTML 5文件可以用QT/QXmlPatterns解析吗?或者这是一场输了的战争??
  4. 有没有可能有用的外部工具?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-01-24 07:46:52

使用命令行html-确实有效!

从:http://binaries.html-tidy.org/下载html-tidy

使用以下命令行:

tidy.exe -q -b -asxml test.html > test.xml

现在,使用以下代码对结果xml文件使用QXmlQuery很好:

代码语言:javascript
运行
复制
#include <QFile>
#include <QXmlQuery>
#include <QBuffer>
#include <QXmlFormatter>
#include <QException>
#include <QAbstractMessageHandler>
#include <iostream>
#include <string.h>
#include <QCoreApplication>

using namespace std;

class ParserMsgHandler: public QAbstractMessageHandler
{
    virtual void handleMessage( QtMsgType type, const QString &description, const QUrl &identifier, const QSourceLocation &sourceLocation )
    {
        QString mt = "";
        switch( type )
        {
        case QtDebugMsg:
            mt = "DBG: ";
            break;
        case QtWarningMsg:
            mt = "WRN: ";
            break;
        case QtCriticalMsg:
            mt = "CRT: ";
            break;
        case QtFatalMsg:
            mt = "FTL: ";
            break;
        case QtInfoMsg:
            mt = "INF: ";
            break;
        }

        QString msg = "\r\n" +
                      mt +
                      "Line: " + sourceLocation.line() +
                      ", Column: " + sourceLocation.column() +
                      ", Id: " + identifier.toString() +
                      ", Desc: " + description;
        cout << msg.toUtf8().constData();
    }
};

ParserMsgHandler gHandler;

int main(int argc, char *argv[])
{
    QCoreApplication a( argc, argv );

    try
    {
        QString htmlFilename = a.arguments()[1];
        QString xqueryFilename = a.arguments()[2];
        QFile queryFile( xqueryFilename );
        queryFile.open( QIODevice::ReadOnly );
        const QString queryStr( QString::fromUtf8( queryFile.readAll() ) );
        QXmlQuery query;
        QFile sourceDocument;
        sourceDocument.setFileName( htmlFilename );
        sourceDocument.open( QIODevice::ReadOnly );

        QByteArray outArray;
        QBuffer buffer( &outArray );
        buffer.open( QIODevice::ReadWrite );

        query.bindVariable( "inputDocument", &sourceDocument );
        query.setQuery( queryStr );
        query.setMessageHandler( &gHandler );
        if( !query.isValid() )
        {
            cout << "\r\nError: Bad Query or Document!\r\n";
            return -1;
        }

        QXmlFormatter formatter( query, &buffer );
        if( !query.evaluateTo( &formatter ) )
        {
            cout << "\r\nError: Evaluation Failed!\r\n";
            return -2;
        }

        buffer.close();
        cout << "\r\nOutput:\r\n" << outArray.constData() << "\r\n";
        return a.exec();
    }
    catch( QException e )
    {
        cout << "\r\nExecption: " << e.what() << "\r\n";
    }
    catch( ... )
    {
        cout << "\r\nExecption: Big one...\r\n";
    }

    return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41822004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档