C#はXMLファイルの処理を強力にサポートしており、読み込みと解析が容易です。この記事では、XmlDocument
クラス(DOMアプローチ)とXDocument
クラス(LINQ to XMLアプローチ)という2つの主要な方法を解説します。それぞれの方法の長所と使用方法について詳しく見ていきます。
目次
XmlDocument
の使用(DOMアプローチ)
XmlDocument
クラスは、XMLファイルのツリー状表現をメモリ上に作成します。これは、XML構造の広範囲な操作が必要なシナリオに最適です。
using System;
using System.Xml;
public class XmlDocumentExample
{
public static void Main(string[] args)
{
string xmlFilePath = "data.xml"; // XMLファイルのパスを指定してください
try
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);
// ルート要素へのアクセス
XmlNode root = doc.DocumentElement;
Console.WriteLine($"ルート要素: {root.Name}");
// ノードの巡回とアクセス
XmlNodeList nodes = root.SelectNodes("//elementName/subElement"); // XPathの例
foreach (XmlNode node in nodes)
{
Console.WriteLine($"要素: {node.Name}, 値: {node.InnerText}");
}
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
}
}
この改良された例では、より効率的なノード選択のためにXPathを使用しています。「data.xml」と「//elementName/subElement」は、ファイルパスと適切なXPath式に置き換えてください。
XDocument
の使用(LINQ to XMLアプローチ)
LINQ to XMLは、特に大規模なファイルの場合、より流暢で効率的なXML解析方法を提供します。そのクエリ構文はデータ抽出を簡素化します。
using System;
using System.Linq;
using System.Xml.Linq;
public class XDocumentExample
{
public static void Main(string[] args)
{
string xmlFilePath = "data.xml"; // XMLファイルのパスを指定してください
try
{
XDocument doc = XDocument.Load(xmlFilePath);
// LINQ to XMLクエリ
var results = doc.Descendants("elementName")
.Select(el => new
{
SubElement1 = el.Element("subElement1")?.Value,
SubElement2 = (string)el.Attribute("attributeName") // 属性へのアクセス
});
foreach (var result in results)
{
Console.WriteLine($"SubElement1: {result.SubElement1}, SubElement2: {result.SubElement2}");
}
}
catch (Exception ex)
{
Console.WriteLine($"エラー: {ex.Message}");
}
}
}
この例では、LINQを使用して要素と属性をクエリする方法を示しています。null条件演算子(?.
)は、潜在的なnull値を適切に処理します。
適切なアプローチの選択
最適なアプローチは、ニーズによって異なります。
- 複雑なXML操作や、解析プロセスの詳細な制御が必要なシナリオには
XmlDocument
を使用します。これは、ドキュメント全体をメモリに読み込むことが問題にならない、小規模なXMLファイルに適しています。 - より単純な解析タスク、特に大規模なXMLファイルの処理には
XDocument
を使用します。そのメモリ効率と簡素化された構文により、大規模なデータセットに対してより効率的な選択肢となります。
コード内で潜在的な例外(FileNotFoundException
など)を適切に処理することを忘れないでください。