ここは、技術情報、身の回りに起こった出来事を、「もしかしたらみんなの役に立つかもしれない」と思って書き留めておく場所です。

Image

C#で簡単にXMLを解析してみる

2012年10月12日
 

XMLで一部の値だけが欲しいときに、なるべく簡単にできる方法を試してみました。

 

単純な例です。

<doc> 
    <head> 
        <title>タイトル</title> 
    </head> 
    <body> 
        <line>一行目</line> 
        <line>二行目</line> 
        <line>三行目</line> 
    </body> 
</doc>

 

このようなXMLの場合、以下のように解析します。

 

XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(textBox1.Text));

XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;

// タイトル表示
Console.WriteLine(root.SelectSingleNode("head/title").InnerText); 

// 行選択
nodeList = root.SelectNodes("body/line");

foreach (XmlNode nd in nodeList)
{
    // 行表示
    Console.WriteLine(nd.InnerText);
}

 

XMLはファイルではなく、文字列で読み込んでいます。

SelextNodes/SelectSingleNodeでXPathを使って直接その要素を指定しています。

エラー処理は行っていませんので、ご注意ください。

 

ちょっと複雑な次の例です。

<doc>
    <head>
        <title>タイトル</title>
    </head>
    <body>
        <text>
            <font>ゴシック</font>
            <text>あああ</text>
        </text>
        <text>
            <font>明朝</font>
            <text>いいい</text>
        </text>
    </body>
</doc>

 

あえてtextの中にtextを配置しています。

この場合は、

XmlDocument doc = new XmlDocument();
doc.Load(new StringReader(textBox1.Text));

XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;

// タイトル表示
Console.WriteLine(root.SelectSingleNode("head/title").InnerText);
nodeList = root.SelectNodes("body/text");

//Change the price on the books.
foreach (XmlNode nd in nodeList)
{
    // フォント
    Console.WriteLine(nd.SelectSingleNode("font").InnerText);
    // テキスト
    Console.WriteLine(nd.SelectSingleNode("text").InnerText);
}

 

という感じになります。

簡単に取り出すということを目的としていますので、巨大なXMLの場合のは考慮していません。

 

名前空間がある場合は、XmlNamespaceManagerを使ったりします。

また、属性(attribute)指定をしたい場合は、XPathに追加で記述します。