MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - HTMLのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - HTML
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == Qtでは、HTMLを詳細にパースするライブラリが存在しないため、外部ライブラリを使用する必要がある。<br> <br> HTMLがパースできるライブラリを、以下に示す。<br> * libxml2 *: 概要 *: libxml2は、XML文書を解析し、XPathクエリを実行するための非常に人気があるC言語ライブラリである。 *: C++からも使用可能である。 *: <br> *: XPathサポート *: XPath 1.0をサポートしている。 *: <br> * TinyXML-2 *: 概要 *: 軽量で簡単に使用できるC++のXML解析ライブラリである。 *: XPathの直接的なサポートは無いが、XMLノードを簡単に走査して目的のデータを見つけるための機能がある。 *: <br> *: XPathサポート *: 直接的なXPathサポートは無いが、独自の検索関数を記述することで類似の機能を実現できる。 *: <br> * PugiXML *: 概要 *: 軽量かつ高速なXML解析ライブラリで、C++で開発されている。 *: <br> *: XPathサポート *: XPath 1.0をフルサポートしており、HTMLやXMLファイルからのデータ抽出に適している。 *: <br> * Xerces-C++ *: 概要 *: Apache Software Foundationにより開発された高性能なXML解析ライブラリである。 *: DOM、SAX、XPath 1.0をサポートしている。 *: <br> *: XPathサポート *: XPath 1.0をサポートしている。 <br><br> == XPath == ==== libxml2ライブラリ ==== ===== libxml2ライブラリとは ===== libxml2ライブラリは、XMLの処理に主眼を置いているが、HTMLの解析と操作にも対応している。<br> HTMLはXMLと比較して構造が緩やかであり、しばしば厳密な文法規則に従っていないため、libxml2ライブラリはHTMLの特性に合わせた機能を提供している。<br> <br> libxml2ライブラリは、整形式でないHTMLドキュメントを解析する能力を持っている。<br> これは、閉じタグの欠落や属性値の引用符の省略等、Webページでよく見られる不完全なマークアップを適切に処理できることを意味する。<br> libxml2ライブラリは、可能な限りドキュメントの構造を推測して、妥当なDOM (Document Object Model) ツリーを構築する。<br> <br> HTMLの解析には、libxml2ライブラリのhtmlParserモジュールが使用される。<br> このモジュールは、一般的なHTMLの特殊性、例えば大文字小文字を区別しない要素名、空要素の処理、特定の要素に対するデフォルトの属性の追加等を考慮している。<br> <br> libxml2ライブラリを使用することにより、HTMLドキュメントの読み込み、要素や属性の追加・変更・削除、DOMツリーの操作が可能である。<br> また、XPath式を使用してHTML文書内の特定の要素を検索することもできる。<br> <br> WebスクレイピングやHTMLコンテンツの自動生成、既存のHTMLドキュメントの修正等のタスクにおいて、libxml2ライブラリは有用なツールとなる。<br> <u>ただし、モダンなWebアプリケーションで使用される動的なJavaScriptコンテンツの処理には制限があることに注意が必要である。</u><br> <br> libxml2ライブラリは、HTMLをXHTML (XML準拠のHTML) に変換する機能も提供している。<br> これにより、既存のHTMLコンテンツをより厳格なXML処理パイプラインに統合することが可能となる。<br> <br> このように、libxml2ライブラリはHTMLの処理においても柔軟性と堅牢性を提供して、Webコンテンツを扱う多くのアプリケーションで重要な役割を果たしている。<br> <br> ===== libxml2ライブラリのライセンス ===== libxml2ライブラリのライセンスは、MITライセンスに準拠している。<br> <br> ===== libxml2ライブラリのインストール ===== * パッケージ管理システムからインストール # RHEL sudo dnf install libxml2-devel # SUSE sudo zypper install libxml2-devel <br> * ソースコードからインストール libxml2ライブラリのビルドに必要なライブラリをインストールする。<br> # RHEL sudo dnf install cmake python3-devel \ zlib-devel # zlibライブラリを使用する場合 xz-devel # lzmaライブラリを使用する場合 readline-devel # Readlineライブラリを使用する場合 libicu-devel # ICUライブラリを使用する場合 meson ninja-build # MesonおよびNinjaでビルドする場合 # SUSE sudo zypper install cmake python3-devel \ zlib-devel # zlibライブラリを使用する場合 xz-devel # lzmaライブラリを使用する場合 readline-devel # Readlineライブラリを使用する場合 libicu-devel # ICUライブラリを使用する場合 meson ninja # MesonおよびNinjaでビルドする場合 <br> [https://gitlab.gnome.org/GNOME/libxml2 libxml2ライブラリのGithub]、または、[https://github.com/GNOME/libxml2 libxml2ライブラリのGithub]にアクセスして、ソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍する。<br> tar xf libxml2-v<バージョン>.tar.gz cd libxml2-v<バージョン> <br> libxml2ライブラリをビルドおよびインストールする。<br> mkdir build && cd build # CMakeを使用する場合 cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=<libxml2ライブラリのインストールディレクトリ> \ -DLIBXML2_WITH_HTTP=ON \ # HTTPをサポートする場合 -DLIBXML2_WITH_READLINE=ON \ # Readlineを使用する場合 -DLIBXML2_WITH_ICU=ON \ # ICUライブラリを使用する場合 -DLIBXML2_WITH_ZLIB=ON \ # zlibライブラリを使用する場合 -DLIBXML2_WITH_LZMA=ON \ # lzmaライブラリを使用する場合 .. make -j $(nproc) make install # MesonおよびNinjaを使用する場合 meson setup ./build \ -Dprefix=<libxml2ライブラリのインストールディレクトリ> \ -Dhttp=enabled \ -Dicu=enabled \ -Dlzma=enabled \ -Dzlib=enabled ninja -C ./build ninja -C ./build install <br> ===== 要素の取得 ===== 以下の例では、WebページのHTMLをダウンロードして、<head>タグ内の<title>タグの値を抽出している。<br> <br> 具体的には、まず、<code>QNetworkAccessManager</code>クラスを使用してHTTPリクエストを送信して、<code>QNetworkReply</code>クラスを使用してレスポンスを受信する。<br> 次に、libxml2ライブラリを使用して、受信したレスポンスから<head>タグ内の<title>タグの値を抽出する。<br> <br> libxml2ライブラリは、C言語で記述されたライブラリであるため、メモリ管理には特に注意が必要である。<br> 例えば、<code>xmlFreeDoc</code>関数、<code>xmlXPathFreeContext</code>関数、<code>xmlFree</code>関数等を適切に使用すること。<br> <br> <syntaxhighlight lang="make"> # Qtプロジェクトファイル (.pro) # Pkg-configを使用する場合 CONFIG += link_pkgconfig PKGCONFIG += libxml-2.0 # Pkg-Configを使用しない場合 LIBS += -lxml2 INCLUDEPATH += /<libxml2のインストールディレクトリ>/include/libxml2 </syntaxhighlight> <br> <syntaxhighlight lang="cmake"> # CMakeLists.txtファイル # pkg-configを使うための準備 find_package(PkgConfig REQUIRED) # pkg-configを使用してlibxml2ライブラリを検索 pkg_search_module(LIBXML2 REQUIRED libxml-2.0) # ライブラリのインクルードディレクトリをターゲットに追加 include_directories(${LIBXML2_INCLUDE_DIRS}) # ライブラリのリンクディレクトリをターゲットに追加 link_directories(${LIBXML2_LIBRARY_DIRS}) target_include_directories(<プロジェクト名> PRIVATE # ...略 ${LIBXML2_INCLUDE_DIRS} ) target_link_libraries(<プロジェクト名> # ...略 ${LIBXML2_LIBRARIES} ) # libxml2のコンパイルオプション add_definitions( # ...略 ${LIBXML2_CFLAGS_OTHER} ) </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // main.h #ifndef MAIN_H #define MAIN_H #include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkReply> class HtmlTitleFetcher : public QObject { Q_OBJECT private: QNetworkAccessManager *m_pManager; QNetworkReply *m_pReply; QUrl url; private: void parseHtml(const QByteArray &htmlData); public: HtmlTitleFetcher(const QUrl &url, QObject *parent = nullptr); private slots: void onFinished(); }; #endif // MAIN_H </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // main.cpp #include <libxml/HTMLparser.h> #include <libxml/xpath.h> #include "main.h" HtmlTitleFetcher::HtmlTitleFetcher(const QUrl &url, QObject *parent) : QObject(parent), url(url) { m_pManager = new QNetworkAccessManager(this); QNetworkRequest request(url); m_pReply = manager->get(request); connect(m_pReply, SIGNAL(finished()), this, SLOT(onFinished())); } void HtmlTitleFetcher::onFinished() { if (m_pReply->error() == QNetworkReply::NoError) { QByteArray htmlData = m_pReply->readAll(); parseHtml(htmlData); } else { std::cerr << QString("エラー : %1").arg(m_pReply->errorString()).toStdString() << std::endl; } reply->deleteLater(); } void HtmlTitleFetcher::parseHtml(const QByteArray &htmlData) { htmlDocPtr doc = htmlReadMemory(htmlData.data(), htmlData.size(), nullptr, "UTF-8", HTML_PARSE_RECOVER | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); if (doc == nullptr) { std::cerr << QString("HTMLデータのパースに失敗").toStdString() << std::endl; return; } xmlXPathContextPtr context = xmlXPathNewContext(doc); if (context == nullptr) { xmlFreeDoc(doc); std::cerr << QString("XPathの生成に失敗").toStdString() << std::endl; return; } xmlXPathObjectPtr result = xmlXPathEvalExpression((const xmlChar*)"//title", context); if (result == nullptr) { xmlXPathFreeContext(context); xmlFreeDoc(doc); std::cerr << QString("XPath式の評価に失敗").toStdString() << std::endl; return; } xmlNodeSetPtr nodeset = result->nodesetval; if (xmlXPathNodeSetIsEmpty(nodeset)) { std::cerr << QString("<title>タグが存在しません").toStdString() << std::endl; } else { xmlNodePtr cur = nodeset->nodeTab[0]; if (cur != nullptr && cur->children != nullptr) { xmlChar *content = xmlNodeGetContent(cur); std::cerr << QString("<title>タグの値 : %1").arg(QString((char *)content)).toStdString() << std::endl; xmlFree(content); } } xmlXPathFreeObject(result); xmlXPathFreeContext(context); xmlFreeDoc(doc); } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QUrl url("https://www.example.com"); HtmlTitleFetcher fetcher(url); return app.exec(); } </syntaxhighlight> <br> <code>LIBXML_TEST_VERSION</code>マクロは、libxml2ライブラリを使用する場合に、ライブラリのバージョンが使用者のプログラムが期待するものと一致していることを保証するために用いられる。<br> このマクロは、libxml2のヘッダファイルをインクルードした後に呼び出すことにより、プログラムがリンクされるlibxml2ライブラリのバージョンがヘッダファイルで定義されているバージョンと互換性があるかどうかを確認する。<br> もし互換性が無ければ、実行時にエラーが発生する。<br> <br> <code>LIBXML_TEST_VERSION</code>マクロを使用する主な理由は、APIの非互換性による問題を防ぐことである。<br> libxml2ライブラリは頻繁に更新されるため、新しいバージョンのライブラリには古いバージョンのコードとは互換性のない新機能や変更が含まれることがある。<br> <code>LIBXML_TEST_VERSION</code>マクロを使用することにより、開発中にこの種の問題を早期に検出して対処することができる。<br> <br> したがって、<code>LIBXML_TEST_VERSION</code>マクロの記述は必須ではないが、<br> ライブラリのバージョンに依存する可能性のあるプログラムを開発している場合、特にライブラリの更新によって互換性の問題が生じる可能性がある場合には、このマクロを使用することを推奨する。<br> <br> これにより、将来的な互換性の問題を防ぐことができ、より安定したソフトウェアの開発が可能になる。<br> <br><br> == 文字実体参照 / 数値文字参照 == HMTLの文字実体参照や数値文字参照を通常の文字に変換する。<br> <br> <syntaxhighlight lang="cmake"> # CMakeを使用する場合 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Gui) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui) pkg_check_modules(QT_GUI Qt${QT_VERSION_MAJOR}Gui REQUIRED IMPORTED_TARGET) target_link_libraries(<ターゲット名> Qt${QT_VERSION_MAJOR}::Gui ) </syntaxhighlight> <br> <syntaxhighlight lang="make"> # QMakeを使用する場合 QT += gui </syntaxhighlight> <br> <syntaxhighlight lang="c++"> #include <QTextDocumentFragment> // 文字実体参照や数値文字参照を変換 QString plainText = QTextDocumentFragment::fromHtml(htmlString).toPlainText(); </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - HTML
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse