【发布时间】:2015-03-26 17:13:31
【问题描述】:
我需要一些帮助,将带有子节点的 XML 转换为 csv 文件。
这是我的 XML:
<Main>
<root>
<Name>Sample name1</Name>
<StreetAddress>Sample Address1</StreetAddress>
<Service>
<Type>Outlet</Type>
<PhoneNumber></PhoneNumber>
<Openweekday>Closed</Openweekday>
</Service>
<Service>
<Type>Mall</Type>
<PhoneNumber></PhoneNumber>
<Openweekday>Closed</Openweekday>
</Service>
</root>
<root>
<Name>Sample name2</Name>
<StreetAddress>Sample Address2</StreetAddress>
<Service>
<Type>Shop</Type>
<PhoneNumber></PhoneNumber>
<Openweekday>Closed</Openweekday>
</Service>
</Main>
预期的 CSV 结果:
Name,StreetAddress,Type,PhoneNumber,OpenweekDay,Type,PhoneNumber,OpenweekDay
Sample name1,Sample Address1,Outlet,,Closed,Mall,,Closed
Sample name2,Sample Address2,Shop,,Closed
尝试了我从 MSDN 获得的这段代码。但它会抛出一个空异常 -
XElement custOrd = XElement.Load("xxx.xml");
string csv =
(from el in custOrd.Element("Main").Elements("root")
select
String.Format("{0},{1},{2},{3},{4},{5},{6},{7}",
(string)el.Attribute("Name"),
(string)el.Element("StreetAddress"),
(string)el.Element("Service").Element("Type"),
(string)el.Element("Service").Element("PhoneNumber"),
(string)el.Element("Service").Element("Openweekday"),
(string)el.Element("Service").Element("Type"),
(string)el.Element("Service").Element("PhoneNumber"),
(string)el.Element("Service").Element("Openweekday"),
Environment.NewLine
)
)
.Aggregate(
new StringBuilder(),
(sb, s) => sb.Append(s),
sb => sb.ToString()
);
Console.WriteLine(csv);
让我知道如何在 linq 中管理空值。
【问题讨论】:
-
@paqogomez - 如何在 linq 中为每个元素管理 null?服务节点丢失时如何处理?我是 linq 的新手。
-
@paqogomez - 您添加的重复参考帖子没有回答我的问题?您可以删除它以便其他人可以帮助我吗?
-
除了你之外没有人看到,尽管其他人可以投票决定它是否真的重复。到目前为止,只有一个人同意我的观点。至于您的问题,在我看来,内联 if 语句可以解决您的问题。类似
el.Element("Service").Element("PhoneNumber") == null ? "" : el.Element("Service").Element("PhoneNumber"); -
我提供的重复链接很好地涵盖了该内联语句。
标签: c# xml linq export-to-csv