C++でXML処理を扱う方法

C++でXML処理を扱う方法

Aspose.Cells FOSS for C++ には、内部で Open XML パーツの読み書きに使用される軽量な XML 処理レイヤーが含まれています。XmlDocument、XmlElement、および XmlAttribute クラスは、XML データへのプログラム的アクセスを提供します。このガイドでは、XML のロード、要素の走査、ドキュメントのシリアライズについて説明します。

ステップバイステップガイド

ステップ 1: ビルドの設定

cmake_minimum_required(VERSION 3.15)
project(XmlProcessing CXX)
set(CMAKE_CXX_STANDARD 17)

add_subdirectory(path/to/Aspose.Cells-FOSS-for-Cpp)
add_executable(XmlProcessing main.cpp)
target_link_libraries(XmlProcessing PRIVATE Aspose.Cells.Foss.Cpp)

ステップ 2: ヘッダーをインクルード

#include "aspose/cells_foss/XmlDocument.h"
#include "aspose/cells_foss/XmlElement.h"
#include "aspose/cells_foss/XmlAttribute.h"

using namespace Aspose::Cells_FOSS;

ステップ 3: XML ドキュメントをロード

メモリ内のドキュメントツリーに XML 文字列を解析するには、XmlDocument::Load を使用します:

int main() {
    XmlDocument doc;
    doc.Load("<root><item key=\"a\">Hello</item><item key=\"b\">World</item></root>");
    return 0;
}

ステップ 4: Null 要素をチェック

XmlElement はハンドルベースのモデルを使用します — 存在しないパスから返される要素は null です。データにアクセスする前に必ず IsNull() をチェックしてください:

XmlElement root = doc.GetRootElement();
if (!root.IsNull()) {
    std::string val = root.GetValue();
}

ステップ 5: 属性を走査

XmlElement::GetAttributes() を使用して属性コレクションを取得します。各属性ハンドルはその名前と値を公開します:

auto attrs = root.GetAttributes();
for (auto& attr : attrs) {
    bool isNull = attr.IsNull();
}

ステップ 6: UTF-8 文字列にシリアライズ

XmlDocument::SaveToUtf8() を使用してシリアライズされた XML を取得します:

std::string xml = doc.SaveToUtf8();

ステップ 7: パースエラーの処理

信頼できない XML を処理する際は、XmlDocument::Load を try/catch ブロックでラップしてください:

try {
    doc.Load(xmlContent);
} catch (const XmlParsingException& ex) {
    // Handle malformed XML
}

一般的な問題と対処法

IsNull() 予期せず true を返します 要素パスがドキュメントに存在しません。トラバースする前に、XML の構造が期待するスキーマと一致しているか確認してください。

XmlParsingException ロード時に 入力が不正な形式であるか、サポートされていないエンティティが含まれています。外部ツールで XML を検証してから渡す前に Load.

SaveToUtf8() 予期しない出力が返されます ドキュメント構造はその後変更されました Load。すべての中間項目を確認してください Build 操作が正しく完了しました。

属性が見つかりません 属性の検索は大文字小文字を区別します。属性名が XML ソースに表示されている通り正確に一致しているか確認してください。

空の結果が返されました GetValue() 空白のみを含むテキストノードは空文字列を返すことがあります。要素に空白以外の内容があるか確認するため、元の XML をチェックしてください。

よくある質問

XML レイヤーはアプリケーションでの使用を意図したものですか、それとも内部使用のみですか?

XmlDocument、XmlElement、XmlAttribute クラスは公開された API の一部で、直接使用できます。マッパークラス(WorkbookXmlMapper、WorksheetXmlMapper など)は XlsxWorkbookSerializer が呼び出す内部ヘルパーで、直接使用することは意図されていません。

新しい XML ドキュメントをゼロから作成できますか?

はい。XmlDocument::Build を使用してプログラム的にドキュメントを構築し、続いて XmlElement と XmlAttribute::MakeAttribute を使用してノードを追加します。

XmlDocument は XPath クエリをサポートしていますか?

いいえ。現在の実装は要素ハンドルのトラバーサルのみを提供しており、XPath はサポートされていません。

SaveToUtf8() が生成するエンコーディングは何ですか?

出力は常に UTF-8 エンコードされた XML です。XML 宣言(<?xml version="1.0" encoding="UTF-8"?>)が出力に含まれます。

XLSX アーカイブ パーツを読み取るために XmlDocument を使用できますか?

XLSX アーカイブ パーツは XlsxWorkbookSerializer によって内部的に管理されています。生のアーカイブ パーツを抽出するための公開された API はありません。すべての XLSX のロード/セーブ操作には Workbook を使用してください。

参照

 日本語