Aさん「このタグと値が記載されてる表通りに、xml更新しといて~」
私「はーい」
カチッ…
!!数百行!!
私「 」
ということで、簡単なツールを作成することにしました。
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を使った書き方を教えていただきました
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;
}
}
}
さいごに
最近は開発業務から離れていたので、気分転換に効率化を図るツールを開発できて楽しかったです