示唆されているように、LINQ to XMLを使用すると、任意の XML ファイルからデータを解析して抽出できます。
var xml = @"<?xml version=""1.0"" encoding=""utf-8""?><a id=""1"" name=""test"">an element<b>with sub-element</b></a>";
// load XML from string
var xmlDocument = XDocument.Parse(xml);
// OR load XML from file
//var xmlDocument = XDocument.Load(@"d:\temp\input.xml");
// find all elements of type b and in this case take the first one
var bNode = xmlDocument.Descendants("b").FirstOrDefault();
if (bNode != null)
{
Console.WriteLine(bNode.Value);
}
// find the first element of type a and take the attribute name (TODO error handling)
Console.WriteLine(xmlDocument.Element("a").Attribute("name").Value);
出力は次のとおりです。
with sub-element
test
オブジェクトを XML ファイルに簡単に変換することもできます。
// sample class
public class Entry
{
public string Name { get; set; }
public int Count { get; set; }
}
// create and fill the object
var entry = new Entry { Name = "test", Count = 10 };
// create xml container
var xmlToCreate = new XElement("entry",
new XAttribute("count", entry.Count),
new XElement("name", entry.Name));
// and save it
xmlToCreate.Save(@"d:\temp\test.xml");
新しく作成された XML ファイルは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<entry count="10">
<name>test</name>
</entry>
LINQ は非常に強力で使いやすい (そして IMO 直感的) です。この MSDN の記事では、優れたサンプルを通じて、LINQ とそのさまざまな機能と能力についての優れた洞察が得られます。LINQPad - ミニマルだが非常に強力な .NET 用 IDE には、非常に優れた組み込みの LINQ to XML チュートリアルと例が付属しています。最後に、MSDN にあるすべての LINQ to XML 拡張メソッドのリストを次に示します。
もう 1 つの可能性は、XmlReader クラスを使用して任意の XML ファイルを解析することです。ここでは、解析ロジックを実装する責任があるため、面倒な場合があります。XmlReader を使用して同じ入力ファイルを解析すると、次のようになります。
public void parseUsingXmlReader(string xmlString)
{
using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
{
XmlWriterSettings ws = new XmlWriterSettings();
ws.Indent = true;
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine(string.Format("Element - {0}", reader.Name));
if (reader.HasAttributes)
{
for (var i = 0; i < reader.AttributeCount; i++)
{
Console.WriteLine(string.Format("Attribute - {0}", reader.GetAttribute(i)));
}
reader.MoveToElement();
}
break;
case XmlNodeType.Text:
Console.WriteLine(string.Format("Element value - {0}", reader.Value));
break;
//case XmlNodeType.XmlDeclaration:
//case XmlNodeType.ProcessingInstruction:
// Console.WriteLine(reader.Name + " - " + reader.Value);
// break;
case XmlNodeType.Comment:
Console.WriteLine(reader.Value);
break;
case XmlNodeType.EndElement:
Console.WriteLine(reader.Value);
break;
}
}
}
}
// use the new function with the input from the first example
parseUsingXmlReader(xml);
出力は次のとおりです。
Element - a
Attribute - 1
Attribute - test
Element value - an element
Element - b
Element value - with sub-element
ご覧のとおり、ノードの種類、現在の位置、属性などを手動で処理する必要があります。