65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 XML 到 CSV 的转换器

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.23/5 (7投票s)

2007年5月11日

2分钟阅读

viewsIcon

85556

downloadIcon

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 可以(并且可能)变得更加复杂,具体取决于你的需要。我希望人们觉得有趣,并且其他人能找到它的用处。

历史

目前没有计划进行进一步的更新,但欢迎所有评论/建议

© . All rights reserved.