LoginSignup
0
0

C#でCSVファイルを読み込んでXMLを更新する方法

Last updated at Posted at 2023-11-15

Aさん「このタグと値が記載されてる表通りに、xml更新しといて~」
私「はーい」
カチッ…
!!数百行!!
私「 :neutral_face:

ということで、簡単なツールを作成することにしました。

C#を使用してcsvファイルからタグ名と値を読み込み、更新されたXMLファイルを生成する手順を紹介します!
私自身、C#をあまり使用したことがないので、アドバイス等あればお願いします。(なぜC#で開発した)

サンプルコード

Program.cs
using System;
using System.IO;
using System.Xml;

class Program
{
    static void Main(string[] args)
    {
        // 基のXMLファイル名
        string inputXmlFileName = "input.xml";

        // CSVファイル名
        string csvFileName = "data.csv";

        // 出力XMLファイル名
        string outputXmlFileName = "output.xml";

        // XMLドキュメントの読み込み
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(inputXmlFileName);

        // CSVファイルを処理してXMLデータを更新
        UpdateXmlNodesFromCsvLine(csvFileName, xmlDoc);

        // XMLファイルの出力設定
        XmlWriterSettings xmlSettings = new XmlWriterSettings();
        xmlSettings.Indent = true;

        // 更新されたXMLデータを新しいXMLファイルに保存
        using (XmlWriter writer = XmlWriter.Create(outputXmlFileName, xmlSettings))
        {
            xmlDoc.Save(writer);
        }

        Console.WriteLine("XMLファイルの生成が完了しました.");
    }

    static void UpdateXmlNodesFromCsvLine(string csvFileName, XmlDocument xmlDoc)
    {
        if (!File.Exists(csvFileName))
        {
            return;
        }
        // CSVファイルの各行を処理
        string[] csvLines = File.ReadAllLines(csvFileName);
        foreach (string csvLine in csvLines)
        {
            // 行をカンマで分割
            string[] csvParts = csvLine.Split(',');
            if (csvParts.Length != 2)
            {
                continue;
            }
            // CSVファイルからタグ名と値を取得
            string tagName = csvParts[0].Trim();
            string tagValue = csvParts[1].Trim();
    
            // タグ名と一致するXMLノードを取得し、値を更新
            XmlNodeList nodes = xmlDoc.GetElementsByTagName(tagName);
            foreach (XmlNode node in nodes)
            {
                node.InnerText = tagValue;
            }
        }
    }
}

動作説明

事前に定義されたXMLファイルを準備します。

input.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <person>
    <name>Taro Tanaka</name>
    <age>30</age>
  </person>
  <address>
    <city>Osaka</city>
    <country>Japan</country>
  </address>
</root>

CSVファイルには、XMLファイルで更新したい要素の情報が含まれています。

data.csv
name,田中太郎
city,東京

実行すると…

output.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <person>
    <name>田中太郎</name>
    <age>30</age>
  </person>
  <address>
    <city>東京</city>
    <country>Japan</country>
  </address>
</root>

output.xmlが生成されました!

追記

@kuro4 さんからLINQを使った書き方を教えていただきました:clap:

Program.cs
static void UpdateXmlNodesFromCsvLine(string csvFileName, XmlDocument xmlDoc)
{
    if (!File.Exists(csvFileName))
    {
        return;
    }
    var lines = File.ReadAllLines(csvFileName).Select(x => x.Split(',')).Where(x => x.Length == 2).Select(x => (tagName: x[0].Trim(), tagValue: x[1].Trim()));
    foreach ((string tagName, string tagValue) in lines)
    {
        XmlNodeList nodes = xmlDoc.GetElementsByTagName(tagName);
        foreach (XmlNode node in nodes)
        {
            node.InnerText = tagValue;
        }
    }
}

さいごに

最近は開発業務から離れていたので、気分転換に効率化を図るツールを開発できて楽しかったです:relaxed:

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0