本記事は、[C#での設定ファイル管理とパラメータのバージョンアップ]の続きとして、XMLを読み込む方法として、Linq to XMLによる設定情報やパラメータの扱いについて記載します。なお、書き込みについては、XMLのXpathによる部分を参照してください。
Contents
Linq to XMLによる読み込み
C#でLINQが.netで利用可能になってからLinq to XMLによるXML読み込みが可能になりました。これにより、古くからのXPath(DOM)によってXMLを扱うより速度も改善され、XMLも扱いやすくなったメリットは大きいです。
サンプルで使うXML
XMLはXPathによるXML読み込み時のXMLと同じものを使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8"?> <root> <AppInfo> <AppName>Naruhodo</AppName> <Module>LinqToXml</Module> <Version>1</Version> </AppInfo> <User ID="1001"> <Name>Suzuki</Name> <Age>27</Age> </User> <User ID="1002"> <Name>Tanaka</Name> <Age>25</Age> </User> <User ID="1003"> <Name>Takahashi</Name> <Age>23</Age> </User> </root> |
Linq to XMLXML読み込み
基本はXPathによる方法と同じく、XMLファイルをXmlDocumentとしてLoadしてから使います。
サンプル1:階層を持った処理の後、Linq to XMLで読み込み
Linqを使うこと以外に、XPathによる方法と大きな違いはありません。
usr.Attribute(“ID”);のように記述することで、XMLのAttribute部分に書いた情報を取得することもできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class Param_LinqToXml { private string _xmlFile = @"c:\temp\ParamLinqToXml.xml"; public void Load1() { //XMLファイル読み込み XDocument xdoc = XDocument.Load(_xmlFile); XElement xel = xdoc.Element("root"); IEnumerable<XElement> xml = xel.Elements("User"); IEnumerable<XElement> Users = xml.Where(x => (int)x.Element("Age") <= 25); foreach (XElement usr in Users) { XAttribute id = usr.Attribute("ID"); XElement name = usr.Element("Name"); XElement age = usr.Element("Age"); Console.WriteLine($"id={id.Value} name={name.Value} age={age}"); } } } |
サンプル2:階層を意識せずノード名から直接Linq to XMLで読み込む
Descendants()を使うことで、XMLの面倒な階層構造を気にせず、ノード名を指定し、リストを取得することがメリットがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Param_LinqToXml { private string _xmlFile = @"c:\temp\ParamLinqToXml.xml"; public void Load2() { //XMLファイル読み込み XDocument xdoc = XDocument.Load(_xmlFile); //IEnumerable<XElement> Users = xdoc.Descendants("User");//Descendants()は階層関係なく IEnumerable<XElement> Users = xdoc.Descendants("User").Where(x => (int)x.Attribute("ID") >= 1002); foreach (XElement usr in Users) { XAttribute id = usr.Attribute("ID"); XElement name = usr.Element("Name"); XElement age = usr.Element("Age"); Console.WriteLine($"id={id.Value} name={name.Value} age={age}"); } } } |
出力結果
サンプル1,サンプル2ともに同じ結果になります。
Linq to XMLによる読み込みとクラス関連付け
Linq to XMLによるXMLを読み込んだ後、クラスへの反映は、XPathによるXML読み込み方法と大きく変わりありません。XMLのXPathによる読み書きのページを参照してください。
パラメータバージョンアップにおけるLinq to XML管理による影響
Linq to XMLによって設定情報を管理するも、XPathによるXML管理と大きく変わりありません。
まとめ
Linq to XMLによるXMLファイル管理は、XPathによるXMLの読み込みが発展し、LINQを利用することで利用しやすくなったことになります。さらに速度面でもかなり改善されているようなので、XPathによるXML読み込みよりは、Linq to XMLによるXML読み込みを推奨します。