酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでC#を使ってXMLファイルをロードする

XMLファイルから、特定のタグで囲われた文字列を取得する方法ってどうやるんだろ;;

……というツイートを見かけましたので、XMLファイルをアプリ内に持っている場合と、string型のXML文字列についてご紹介します。参考になれば嬉しいかも。

XMLを読み込む前の前準備

XMLFile.xmlというXMLのデータを読み込む前提で前準備を進めましょう。ソリューションエクスプローラーにXMLFile.xmlを追加します。新規でも問題ありません。

この時、ビルドアクションは「コンテンツ」にしておきましょう。

System.Xml.Linqを使用したいので、参照の追加でSystem.Xml.Linqを追加しておいてください。

xmlの中身はこんな感じです。

<?xml version="1.0" encoding="utf-8" ?>
<items>
  <item no="3">
    <name>割りと普通</name>
    <name_en>normalian</name_en>
  </item>
  <item no="2">
    <name>しばやん</name>
    <name_en>shibayan</name_en>
  </item>
  <item no="5">
    <name>酢酸</name>
    <name_en>ch3cooh</name_en>
  </item>
</items>

さて、XMLをロードするトリガーですが、OnNavigatedToをオーバーライドして、XMLファイルをロードする処理をここに書きましょう。

namespace XmlTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }

        /// <summary>
        /// ここでXMLファイルをロードする
        /// </summary>
        /// <param name="e"></param>
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) {
        }
    }
}

アプリ内のXMLコンテンツから情報を取得する

App.GetResourceStreamメソッドで

protected override void OnNavigatedTo(NavigationEventArgs e) {
    
    // アプリケーションファイル内からXMLファイルの情報を取り出す
    var info = App.GetResourceStream(new Uri("XMLFile.xml", UriKind.Relative));
    // ストリームからXDocumentインスタンスを生成
    var doc = XDocument.Load(info.Stream);

    // item要素の数を取得する
    var items = doc.Descendants("item");
    int count = items.Count();

    foreach (var item in items) {
        // item要素のno属性の値を取得する
        var no = item.Attribute("no").Value;
        // 子要素nameの値を取得する
        var name = item.Element("name").Value;
    }
} 

string型のXML文字列から情報を取得する

protected override void OnNavigatedTo(NavigationEventArgs e) {
    
    string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><items><item no=\"3\"><name>割りと普通</name><name_en>normalian</name_en></item><item no=\"2\"><name>しばやん</name><name_en>shibayan</name_en></item><item no=\"5\"><name>酢酸</name><name_en>ch3cooh</name_en></item></items>";
    // ストリームからXDocumentインスタンスを生成
    var doc = XDocument.Parse(xml);
    var items = doc.Descendants("item");

    // item要素の数を取得する
    int count = items.Count();

    foreach (var item in items) {
        // item要素のno属性の値を取得する
        var no = item.Attribute("no").Value;
        // 子要素nameの値を取得する
        var name = item.Element("name").Value;
    }
}