首先,我想从这样一个事实开始,即我是编码的先行者,特别是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;
}
}
答案 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