困ったときにそのまま使える LINQ to XML コードサンプル 18 パターン [1/2]
LINQ to XML の単純なコードサンプル集です。XML 文書の作成、ノードの追加、削除、更新、LINQ 及び XPath による XML 要素の選択方法について、 判りやすいコードサンプルを示します。
XML ドキュメント、ファイルの作成・保存
XML ファイルの作成
var xml = new XDocument( new XDeclaration( "1.0" , "utf-8" , "true" ) , new XComment( "LINQ to XML Sample http://keicode.com/" ) , new XElement( "Employees" ) ); xml.Save( @"C:\Temp\LINQ_to_XML_Sample1.xml" );
この結果、次のような XML ファイルが作成されます。
<?xml version="1.0" encoding="utf-8"?> <!--LINQ to XML Sample http://keicode.com/--> <Employees />
要素を含む XML ファイルの作成
var xml = new XDocument( new XDeclaration( "1.0" , "utf-8" , "true" ) , new XComment( "LINQ to XML Sample http://keicode.com/" ) , new XElement( "Employees", new XElement( "Employee", new XElement("FirstName", "Keisuke"), new XElement("LastName", "Oyama"), new XElement("ID", 123) ) ) ); xml.Save( @"C:\Temp\LINQ_to_XML_Sample2.xml" );
この結果、次のような XML ファイルが作成されます。
<?xml version="1.0" encoding="utf-8"?> <!--LINQ to XML Sample http://keicode.com/--> <Employees> <Employee> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> </Employees>
複数要素を含む XML ファイルの作成
var xml = new XDocument( new XDeclaration( "1.0" , "utf-8" , "true" ) , new XComment( "LINQ to XML Sample http://keicode.com/" ) , new XElement( "Employees" , new XElement( "Employee" , new XElement( "FirstName" , "Keisuke" ) , new XElement( "LastName" , "Oyama" ) , new XElement( "ID" , 123 ) ), new XElement( "Employee" , new XElement( "FirstName" , "Ichiro" ) , new XElement( "LastName" , "Suzuki" ) , new XElement( "ID" , 456 ) ), new XElement( "Employee" , new XElement( "FirstName" , "Hanako" ) , new XElement( "LastName" , "Yamada" ) , new XElement( "ID" , 789 ) ) ) ); xml.Save( @"C:\Temp\LINQ_to_XML_Sample3.xml" );
この結果、次のような XML ファイルが作成されます。
<?xml version="1.0" encoding="utf-8"?> <!--LINQ to XML Sample http://keicode.com/--> <Employees> <Employee> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> <Employee> <FirstName>Ichiro</FirstName> <LastName>Suzuki</LastName> <ID>456</ID> </Employee> <Employee> <FirstName>Hanako</FirstName> <LastName>Yamada</LastName> <ID>789</ID> </Employee> </Employees>
属性付きの複数要素を含む XML ファイルの作成
XML 要素の属性 (attribute) を指定するには、XElement のコンストラクタに XAttribute 要素を含ませるだけです。
var xml = new XDocument( new XDeclaration( "1.0" , "utf-8" , "true" ) , new XComment( "LINQ to XML Sample http://keicode.com/" ) , new XElement( "Employees" , new XElement( "Employee" , new XAttribute( "Gender" , "Male" ) , new XAttribute( "Age", 20 ), new XElement( "FirstName" , "Keisuke" ) , new XElement( "LastName" , "Oyama" ) , new XElement( "ID" , 123 ) ) , new XElement( "Employee" , new XAttribute( "Gender" , "Male" ) , new XAttribute( "Age" , 30 ) , new XElement( "FirstName" , "Ichiro" ) , new XElement( "LastName" , "Suzuki" ) , new XElement( "ID" , 456 ) ) , new XElement( "Employee" , new XAttribute( "Gender" , "Female" ) , new XAttribute( "Age" , 40 ) , new XElement( "FirstName" , "Hanako" ) , new XElement( "LastName" , "Yamada" ) , new XElement( "ID" , 789 ) ) ) ); xml.Save( @"C:\Temp\LINQ_to_XML_Sample4.xml" );
この結果、以下の XML ファイルが作成されます。
<?xml version="1.0" encoding="utf-8"?> <!--LINQ to XML Sample http://keicode.com/--> <Employees> <Employee Gender="Male" Age="20"> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> <Employee Gender="Male" Age="30"> <FirstName>Ichiro</FirstName> <LastName>Suzuki</LastName> <ID>456</ID> </Employee> <Employee Gender="Female" Age="40"> <FirstName>Hanako</FirstName> <LastName>Yamada</LastName> <ID>789</ID> </Employee> </Employees>
XML ファイルを読み込む
var xdoc = XDocument.Load( @"C:\Temp\LINQ_to_XML_Sample1.xml" ); MessageBox.Show( xdoc.ToString() );
この結果、以下のような結果になります。尚、ここで読み込んだ XML ファイルは上の "XML ファイルの作成" で生成したファイルです。
XML 要素の操作
要素の追加
上で作成した XML ファイルを考えます。こちらの XML です。
<?xml version="1.0" encoding="utf-8"?> <!--LINQ to XML Sample http://keicode.com/--> <Employees />
このルート要素 Employees 以下に、Employee 要素を追加します。そしてその結果をファイルに書き出します。 XElement の Add メソッドで XElement 要素を追加し、Save メソッドでファイルに出力します。
var xelm = XElement.Load( @"C:\Temp\LINQ_to_XML_Sample1.xml" ); var p = new XElement( "Employee" , new XElement( "FirstName" , "Keisuke" ) , new XElement( "LastName" , "Oyama" ) , new XElement( "ID" , 123 ) ); xelm.Add( p ); xelm.Save( @"C:\Temp\LINQ_to_XML_Sample5.xml" );
これによって、次の XML ファイルが作成されました。
<?xml version="1.0" encoding="utf-8"?> <Employees> <Employee> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> </Employees>
要素のコピーを利用した要素の追加
以下のように、LINQ クエリによって要素をひとつ取得して、それを元に XElement のインスタンスを作成することができます。 新しく作成したオブジェクトを追加することによって、要素のコピーを実現できます。
var xelm = XElement.Load( @"C:\Temp\LINQ_to_XML_Sample4.xml" ); var emp = ( from p in xelm.Elements( "Employee" ) select p ).First(); var new_emp = new XElement( emp ); new_emp.Attribute( "Age" ).Value = "50"; xelm.Add( new_emp ); xelm.Save( @"C:\Temp\LINQ_to_XML_Sample6.xml" );
この結果、先頭の Employee 要素がコピーされ、Age 属性だけ "50" に書き換えられて、最後尾に追加されています。
<?xml version="1.0" encoding="utf-8"?> <Employees> <Employee Gender="Male" Age="20"> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> ... <Employee Gender="Male" Age="50"> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> </Employees>
XML 要素の削除
XML 要素を削除するには Remove メソッドを利用します。
var xelm = XElement.Load( @"C:\Temp\LINQ_to_XML_Sample4.xml" ); var emp = ( from p in xelm.Elements( "Employee" ) select p ).First(); emp.Remove(); xelm.Save( @"C:\Temp\LINQ_to_XML_Sample7.xml" );
上記の操作によって、選択した要素 emp が削除されます。
値の更新
要素の値を更新するには要素を選択した後、その値を書き換えれば OK です。
var xelm = XElement.Load( @"C:\Temp\LINQ_to_XML_Sample4.xml" ); var emp = ( from p in xelm.Elements( "Employee" ) select p ).First(); emp.Attribute( "Age" ).Value = "25"; xelm.Save( @"C:\Temp\LINQ_to_XML_Sample8.xml" );
この結果、属性値が書き変わります。
<?xml version="1.0" encoding="utf-8"?> <Employees> <Employee Gender="Male" Age="25"> <FirstName>Keisuke</FirstName> <LastName>Oyama</LastName> <ID>123</ID> </Employee> <Employee Gender="Male" Age="30"> <FirstName>Ichiro</FirstName> <LastName>Suzuki</LastName> <ID>456</ID> </Employee> <Employee Gender="Female" Age="40"> <FirstName>Hanako</FirstName> <LastName>Yamada</LastName> <ID>789</ID> </Employee> </Employees>
尚、ここでは結果がわかりやすいようにファイルに書き出していますが、 必ずしも変更をファイルに書き出す必要はありません。