将XML元素写入.csv文件

时间:2018-02-16 09:04:41

标签: c# xml

  • 首先,我想从这样一个事实开始,即我是编码的先行者,特别是C#。

  • 去年,我收到了一个用C#编写的程序,可以将XML元素写入excel文件(此时我甚至不知道哪种软件)。

  • 我刚编辑了这个程序,这样我就可以从XML文件中获取不同的信息,但我已经碰壁了。

  • 我无法找出如何连接相同标签的2个相同元素:

    <Person>
        <PERSONID>1</PERSONID>
        <FIRSTNAME>VICTOR</FIRSTNAME>
        <LASTNAME>DAN</LASTNAME>
    </Person>
    <Person>
        <PERSONID>2</PERSONID>
        <FIRSTNAME>JHON</FIRSTNAME>
        <LASTNAME>SMITH</LASTNAME>
    </Person>`
    

使输出为DAN VICTOR/SMITH JHON。现在我只有第一部分

persoana = string.Concat(pp.LASTNAME, " ", pp.FIRSTNAME);

所以,何时,

sout.WriteLine(string.Concat(new string[] { "\"", person, "\"" }));

开始,我在.csv文件中为每个人获得了2行,但是如果我有多个带有多个元素的标签,则第一个元素会正确写入,但其余部分会使用最后一个进行更新,这就是为什么我想要连接所有元素。
  - 我遇到的另一个问题是,当我面对没有某些元素的XML时,我得到DBNull error,我试图添加if statement

if (! DBNull.Value.Equals(lr.PARCELLEGALAREA.ToString())){
    parcellegalarea = lr.PARCELLEGALAREA.ToString(); 
}

但它没有做到这一点。调试器继续向我展示:

[DebuggerNonUserCode]
[GeneratedCode("System.Data.Design.TypedDataSetGenerator", "4.0.0.0")]
public double PARCELLEGALAREA
{
    get
    {
        double item;
        try
        {
            item = (double)base[this.tableLand.PARCELLEGALAREAColumn];
        }
        catch (InvalidCastException invalidCastException)
        {
            throw new StrongTypingException("The value for column 'PARCELLEGALAREA' in table 'Land' is DBNull.", invalidCastException);
        }
        return item;
    }
    set
    {
        base[this.tableLand.PARCELLEGALAREAColumn] = value;
    }
}

1 个答案:

答案 0 :(得分:1)

请确保您在所选文件夹中的另一个文件夹中没有相同cgxml的副本 - 这是唯一一个与我同一个人使用您的代码制作重复行的情况,因为我有两个您的example3副本。 cgxml在父目录中有一个,在子目录文件夹中有另一个,我选择父目录

您只能通过修改此行

来使用当前目录中的文件
FileInfo[] files = (new DirectoryInfo(this.folderBrowserDialog1.SelectedPath))
.GetFiles("*.cgxml", SearchOption.TopDirectoryOnly);

而不是:

FileInfo[] files = (new DirectoryInfo(this.folderBrowserDialog1.SelectedPath))
.GetFiles("*.cgxml", SearchOption.AllDirectories);

根据您的要求,您希望每个可能的pacrel / person组合都有一行,因此您的foreach percon循环需要在这样的包裹循环中进行预处理

foreach (CGXML.ParcelRow pr in fisier.Parcel)
                {
                    cat = pr.USECATEGORY;
                    measarea = pr.MEASUREDAREA.ToString();


                    foreach (CGXML.PersonRow pp in fisier.Person)
                    {
                        persoana = string.Concat(pp.LASTNAME, " ", pp.FIRSTNAME);
                        sout.WriteLine(string.Concat(new string[] { "\"", cadgenno.ToString(), "\",\"", sector, "\",\"", persoana, "\",\"", parcellegalarea.ToString(), "\",\"", measarea.ToString(), "\",\"", cat, "\"" }));

                    }
                }

,输出结果为:

ID SECTOR人员ID区域宗地区域宗地类别

1 36 DAN VICTOR 7500 7000 A

1 36 DAN MARIA 7500 7000 A

1 36 DAN VICTOR 7500 500 F

1 36 DAN MARIA 7500 500 F