HUSKING - kotteri

技術系Note

【C#】XMLを扱ってみる

ほとんどJSONの時と同じ

husk.hatenablog.com

1. XMLファイル作成用メソッドを用意

using System.IO; // ←追加
using System.Xml.Serialization; // ← 追加

namespace XMLTestApp
{
    public static class XmlUtils
    {
        /// <summary>
        /// XMLデータ書き込み
        /// </summary>
        /// <param name="obj">XMLへ変換するオブジェクト</param>
        /// <param name="filePath">作成するXMLファイルのパス</param>
        public static void writeXml (object obj, string filePath)
        {
            using (FileStream fs = new FileStream(filePath.ToString(), FileMode.Create))
            using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(XML.XmlData));
                serializer.Serialize(sw, xmlData);
            }
        }
    }
}

2. XMLファイル読込用メソッドを用意

using System.IO; // ←追加
using System.Xml.Serialization; // ← 追加

namespace XMLTestApp
{
    public static class XmlUtils
    {
        /// <summary>
        /// XMLデータ読み込み
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath">読み込むXMLファイルのパス</param>
        /// <returns>XMLから変換されたオブジェクト</returns>
        public static T readXml<T> (string filePath)
        {
            if (!File.Exists(filePath.TOString()))
            {
                // ファイルが存在しない場合終了
                return null;
            }
            using (FileStream fs = new FileStream(filePath.ToString(), FileMode.Open))
            {
                 XmlSerializer serializer = new XmlSerializer(typeof(XML.XmlData));
                 return (T)serializer.Deserialize(fs);
            }
        }
    }
}

3. 実際の使用例

まずXMLへ変換するためのオブジェクトクラスを作成

using System.Xml.Serialization; // ←追加

namespace XMLTestApp
{
    [XmlRoot("PersonList")]
    public class SampleData
    {
        [XmlElement("person")]
        public List<Person> person { get; set; }
    }
    
    public class Person
    {
        [XmlAttribute("name")]
        public string name { get; set; }
        
        [XmlElement("age")]
        public string age { get; set; }
        
        [XmlElement("sex")]
        public string sex { get; set; }
    }
}

①オブジェクトからXMLへ変換

static void Main(string[] args)
{
    // サンプルデータを準備
    SampleData data = new SampleData();
    
    // 一人目の顧客情報
    Person person1 = new Person();
    person1.name = "大泉 洋";
    person1.age = "44歳";
    person1.sex = "男";
    
    // 二人目の顧客情報
    Person person2 = new Person();
    person2.name = "安田 顕";
    person2.age = "43歳";
    person2.sex = "男";
    
    // 三人目の顧客情報
    Person person3 = new Person();
    person3.name = "鈴井 貴之";
    person3.age = "55歳";
    person3.sex = "男";
    
    data.add(person1);
    data.add(person2);
    data.add(person3);
    
    // オブジェクトからXMLへ変換
    string filePath = "C:\sample.xml"
    XmlUtils.writeXml(data, filePath);
}

↓結果、以下の内容のXMLファイルが作成される

<?xml version="1.0" encoding="utf-8"?>
<PersonList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <person name="大泉 洋">
    <age>44歳</age>
    <sex></sex>
  </person>
  <person name="安田 顕">
    <age>43歳</age>
    <sex></sex>
  </person>
  <person name="鈴井 貴之">
    <age>55歳</age>
    <sex></sex>
  </person>
</PersonList>


XMLからオブジェクトへ変換 
XMLファイルは上記で作成したものを使用

static void Main(string[] args)
{
    // XMLからオブジェクトへ変換
    string filePath = "C:\sample.xml"
    SampleData data = XmlUtils.readXml<SampleData>(filePath);
    
    foreach (Person p in data.person)
    {
        Console.WriteLine(p.name);
        Console.WriteLine(p.age);
        Console.WriteLine(p.sex);
        Console.WriteLine("\n");
    }
}

↓コンソール出力

大泉 洋
44歳
男

安田 顕
43歳
男

鈴井 貴之
55歳
男