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 を使用してください。