LINQ to XML のスニペット集

このページでは、LINQ to XML (System.Xml.Linq) のスニペットをまとめる予定のページです。

注意

  • 言語は C# です。
  • コードには using System.Xml.Linq; が必要です。
    • XPath を使用する場合は using System.Xml.XPath; が必要です。

ドキュメントの生成

+ XML宣言あり

var doc = new XDocument(
    // <?xml version="1.0" encoding="UTF-8" ?>
    new XDeclaration("1.0", "UTF-8", "no"),
    // <root/>
    new XElement("root"));

+ <?xml-stylesheet ?>あり

var doc = new XDocument(
    // <?xml version="1.0" encoding="UTF-8" ?>
    new XDeclaration("1.0", "UTF-8", "no"),
    // <?xml-stylesheet type='text/xsl' href='test.xsl'?>
    new XProcessingInstruction("xml-stylesheet", "type='text/xsl' href='test.xsl'"),
    // <root/>
    new XElement("root"));

あとから <?xml-stylesheet ?> を追加する

// ルート要素の前に <?xml-stylesheet type='text/xsl' href='test.xsl'?> を追加
doc.Root.AddBeforeSelf(new XProcessingInstruction("xml-stylesheet", "type='text/xsl' href='test.xsl'"));

ファイルを読み込む

var doc = XDocument.Load("test.xml");

ドキュメントをパースする

var doc = XDocument.Parse(@"<?xml version=""1.0"" encoding=""UTF-8"" ?>
<html xmlns=""http://www.w3.org/1999/xhtml"">
    <head>
        <title>test</title>
    </head>
    <body>
        <div id=""test"">
            <a href=""http://example.com/"">test</a>
        </div>
    </body>
</html>
");

XSLT

var newDoc = new XDocument(); // 変換結果を格納するXDocument
using (XmlWriter writer = newDoc.CreateWriter())
{
    var xslt = new XslCompiledTransform();
    xslt.Load("test.xsl"); // XSL読み込み
    xslt.Transform(doc.CreateReader(), writer); // docをXSL変換
}

ドキュメントの保存

UTF-8 (BOMなし) + インデントありで保存する

// test.xml にXMLを保存
using (var writer = new XmlTextWriter("test.xml", new UTF8Encoding(false)))
{
    writer.Formatting = Formatting.Indented; // インデント
    doc.Save(writer);
}

要素の生成

+ 属性、テキストあり

// <a href="http://example.com">test</a>
var a = new XElement("a",
    new XAttribute("href", "http://example.com/"), 
    "test");

+ 名前空間、属性、テキストあり

// <a xmlns="http://www.w3.org/1999/xhtml" href="http://example.com">test</a>
// (祖先要素ですでにxmlnsが出力されていれば、子孫要素のxmlnsは出力時省略されます)
var a = new XElement((XNamespace)"http://www.w3.org/1999/xhtml" + "a", 
    new XAttribute("href", "http://example.com/"),
    "test"); 

属性のセット

a.SetAttributeValue("href", "http://example.com");

テキストのセット

a.Value = "test"; // 追加の場合は a.Add(new XText("test"));

子要素の追加

var span = new XElement((XNamespace)"http://www.w3.org/1999/xhtml" + "span", "child text"); // <span>child text</span>
a.Add(span); // 末尾に追加

要素のパース

var a = XElement.Parse(@"<a href=""http://example.com"">test</a>"); // タグのパース

要素の検索

子孫も含めて要素を検索 (名前空間なし)

var aElements = doc.Descendants("a"); // 名前空間なしの<a>を取得

子孫も含めて要素を検索 (名前空間あり)

var aElements = doc.Descendants((XNamespace)"http://www.w3.org/1999/xhtml" + "a"); // XHTML名前空間の<a>を取得

XPath検索 (名前空間なし)

var aElements = doc.XPathSelectElements("//a[@href]", ns); // XPath検索 (href属性を持つ、名前空間なしの<a>)

using System.Xml.XPath; が必要です。

XPath検索 (名前空間あり)

var ns = new XmlNamespaceManager(new NameTable());
ns.AddNamespace("h", "http://www.w3.org/1999/xhtml"); // XHTML名前空間の追加
var aElements = doc.XPathSelectElements("//h:a", ns); // XPath検索 (href属性を持つ、XHTML名前空間の<a>)