我一直在网上搜索,我假设有人必须在我之前需要这个并且做得更好,以获取 xml 到 csv 转换器。我有一个非常标准的 xml,如下:
<ArrayOfDealer xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Dealer>
<Cmf>76066699</Cmf>
<DealerNumber/>
<DealershipName>BROWARD MOTORSPORTS - WPB</DealershipName>
</Dealer>
<Dealer>
<Cmf>76071027</Cmf>
<DealerNumber/>
<DealershipName>BROWARD MOTORSPORTS OF FT LAUDERDALE LLC</DealershipName>
</Dealer>
<Dealer>
<Cmf>76014750</Cmf>
<DealerNumber/>
<DealershipName>Jet Ski of Miami</DealershipName>
</Dealer>
<Dealer>
<Cmf>76066987</Cmf>
<DealerNumber/>
<DealershipName>BROWARD MOTORSPORTS - Davie</DealershipName>
</Dealer>
</ArrayOfDealer>
我想将其解析为类似的东西
cmf dealernumber dealershipname
76066699 BROWARD MOTORSPORTS - WPB
76014750 Jet Ski of Miami
76066987 BROWARD MOTORSPORTS - Davie
XML 来自我已存储为字符串的 api。
想法?
编辑:为了澄清,我知道结构将与上面类似,没有进一步的节点嵌套,但实际的标签名称可以非常。
像这样的东西会让你得到你需要的东西吗:
Func<string, string> csvFormat =
t => String.Format("\"{0}\"", t.Replace("\"", "\"\""));
var xml = XDocument.Parse(/* xml text here */);
Func<XDocument, IEnumerable<string>> getFields =
xd =>
xd
.Descendants("Dealer")
.SelectMany(d => d.Elements())
.Select(e => e.Name.ToString())
.Distinct();
var headers =
String.Join(",",
getFields(xml)
.Select(f => csvFormat(f)));
var query =
from dealer in xml.Descendants("Dealer")
select string.Join(",",
getFields(xml)
.Select(f => dealer.Elements(f).Any()
? dealer.Element(f).Value
: "")
.Select(x => csvFormat(x)));
var csv =
String.Join(Environment.NewLine,
new [] { headers }.Concat(query));
这仍然假设<ArrayOfDealer><Dealer>
结构表示相同,但下面的字段可能会发生变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)