C# の学習を支援するプロジェクトとして一般的な xml から csv へのコンバーターを構築し、ヘッダー行を CSV に挿入するエレガントな方法を探しています。ノード名にコンマを追加してXMLデータ値を追加するのと同じ方法でループ内に手動で構築できますが、doc.Descendantsコレクションをコンマ区切りのリストに変換するより効率的な方法があるはずです. おそらく私もデータを間違って追加しています。PHP でこの方法で文字列を構築することは、最適とは言えません。
XML のサンプルを次に示します。
<?xml version="1.0" ?>
<fruits>
<fruit>
<name data="watermelon" />
<size data="large" />
<color data="green" />
</fruit>
<fruit>
<name data="Strawberry" />
<size data="medium" />
<color data="red" />
</fruit>
</fruits>
コードは次のとおりです。
//read the xml doc and remove BOM
string XML2Convert = System.IO.File.ReadAllText(@"C:\Websites\CSharp\Scripts\XML2CSVDocs\test.xml");
XML2Convert.Replace(((char)0xFEFF), '\0');
//parse into doc object
XDocument doc = XDocument.Parse(XML2Convert);
//create a new stringbuilder
StringBuilder sb = new StringBuilder(1000);
foreach (XElement node in doc.Descendants("fruit"))
{
foreach (XElement innerNode in node.Elements())
{
//need a better way here to build the header row in the CSV
//string headerRow = innerNode.Name + ",";
//add the xml data values to the line
//possibly a better way here also to add each value to the line
sb.AppendFormat("{0}", innerNode.Attribute("data").Value + ",");
}
//remove trailing comma before appending the data line
sb.Remove(sb.Length - 1, 1);
//add a line to the stringBuilder object
sb.AppendLine();
}