c# - XML 到 CSV 使用 c# 而不使用 xslt

标签 c# xml csv

我一直在网上搜索,我假设有人在我之前就需要这个并且做得更好,用于 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 来 self 存储为字符串的 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>结构说的一样,但下面的字段可能会改变。

关于c# - XML 到 CSV 使用 c# 而不使用 xslt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21343352/

相关文章:

线宽的 C# 编码约定

xml - 在 VBScript 中格式化 XML 字符串

xml - 如何使用 TXMLDocument 手动构造 Soap Envelope (Delphi 2006)

xml - 从 XPATH 后代值获取父节点

python - 如何使用 pandas 确定每个唯一用户的优先操作

python - 通过复制记录创建大型数据集

csv - 通过过滤合并CSV文件

c# - 如何使用 XML 注释和 Doxygen 记录 C# 项目/程序集?

c# - 如何将服务堆栈 4 与 asp.net MVC 4 并行安装?

c# - 使用 InvokeMember 通过 C# 在 Excel 中的文化特定属性