一个 XML 到 CSV 的转换器






2.23/5 (7投票s)
2007年5月11日
2分钟阅读

85556

2662
这是一个项目中的快速简单代码,可以将 XML 文件转换为 CSV 文件
引言
这基本上是一个非常简单的 Nth 级 XML 到 CSV 转换器的代码。它会将包含以下格式的 XML 文件转换为:
-<structure name="systemBoard" caption="Board 0">
-<property name="memDevice0_0" value="512 Mbytes (400 MHz)" />
</structure>
转换为以下格式的 CSV 文件:
systemboard,Board 0
memDevice0_0,512 Mbytes (400 MHz)
并且它应该将文件转换为它所到达的任何节点子级。
背景
这个想法源于一个工作伙伴的简单 XML 转换请求,他遇到了很大的麻烦。基本上,他向客户出售了一份合同,点点头,微笑,并对所有事情都表示同意,而没有考虑完成合同所需的工作。所以,当他需要向客户汇报合同进展时,他从客户那里得到一个 XML 文件,然后吓坏了,因为他不知道该如何处理它。每次我看到他,我都会忍不住笑。无论如何,我想分享这个,因为我没有在任何地方看到类似的东西,我打赌总有人会觉得它有用。
使用代码
代码的核心是以下代码片段:
/// <summary>
/// N th lever recursion subprocedure
/// </summary>
private void getsubnode(XmlNode vnode,StreamWriter outfilewriter)
{
while (vnode.HasChildNodes==true)
{
string stringtest ="";
foreach (XmlAttribute atttest1 in vnode.Attributes)
{
stringtest = stringtest + atttest1.Value + ",";
}
outfilewriter.WriteLine(stringtest);
foreach (XmlNode vchildnode in vnode)
{
getsubnode(vchildnode,outfilewriter);
}
return;
}
while (vnode.HasChildNodes==false)
{
string stringtest ="";
foreach (XmlAttribute atttest1 in vnode.Attributes)
{
stringtest = stringtest + atttest1.Value + ",";
}
outfilewriter.WriteLine(stringtest);
return;
}
}
它将递归地深入你传递的 XML 文件,并到达文件具有的任何节点深度,然后将每一行转换为 CSV 格式并将其转储到你的输出文件流中。它通过迭代每个节点,输出该级别的属性,然后使用下一个子节点调用自身来做到这一点。当没有另一个子节点级别时,代码会输出该基本级别的属性,然后返回到上一次迭代,以继续处理下一个节点/属性层,直到没有更多的级别或节点为止。
这一切都由表单上的“GO”按钮启动,一旦你有了源文件路径
代码使用 XmlDocument.Load
加载 XML 文件,然后创建你的输出文件流来保存输出数据
private void button2_Click(object sender, System.EventArgs e)
{
XmlDocument test = new XmlDocument();
XmlNode test2;
StreamWriter outwriter;
FileStream outfile = new FileStream(textBox1.Text + ".out",FileMode.OpenOrCreate);
test.Load(textBox1.Text);
test2 = test.DocumentElement;
outwriter = new StreamWriter(outfile);
getsubnode(test2,outwriter);
outwriter.Close();
outfile.Close();
}
简单,但它奏效了
*8o)
关注点
我知道这是代码的简单版本,但它只是为了演示这个原理。输出格式和 IO 可以(并且可能)变得更加复杂,具体取决于你的需要。我希望人们觉得有趣,并且其他人能找到它的用处。
历史
目前没有计划进行进一步的更新,但欢迎所有评论/建议