XML 到 CSV 的转换,如 MS Excel
Posted
技术标签:
【中文标题】XML 到 CSV 的转换,如 MS Excel【英文标题】:XML to CSV conversion like MS Excel 【发布时间】:2021-06-02 20:45:37 【问题描述】:我有以下 XML 输入集
<Bill>
<HeaderGroup>
<Name>Mr Consumer</Name>
<Address>My Factory Address</Address>
</HeaderGroup>
<BillHistoryGroup>
<BillHistoryRow>
<BillMonth>JAN</BillMonth>
<BillUnit>100</BillUnit>
</BillHistoryRow>
<BillHistoryRow>
<BillMonth>FEB</BillMonth>
<BillUnit>200</BillUnit>
</BillHistoryRow>
<BillHistoryRow>
<BillMonth>MAR</BillMonth>
<BillUnit>300</BillUnit>
</BillHistoryRow>
</BillHistoryGroup>
<PaymentHistoryGroup>
<PaymentHistoryRow>
<PaymentMonth>SEP</PaymentMonth>
<PaymentAmount>1000</PaymentAmount>
</PaymentHistoryRow>
<PaymentHistoryRow>
<PaymentMonth>OCT</PaymentMonth>
<PaymentAmount>1500</PaymentAmount>
</PaymentHistoryRow>
</PaymentHistoryGroup>
</Bill>
当我使用 excel 加载此文件时,我想生成 MS Excel 生成的数据的表格视图
鉴于代码可以动态理解输入 XML 数据集中存在的不同数量的记录和列,我如何在 C# 中实现相同的输出。任何帮助将不胜感激!
【问题讨论】:
所以你的第一个任务,是学习如何反序列化 xml。完成后,您可以继续处理其他组件问题 先看docs.microsoft.com/en-us/dotnet/api/…,再推荐joshclose.github.io/CsvHelper。 “代码可以动态理解输入 XML 数据集中存在的不同数量的记录和列。” 这是不可能的。 XML 有许多可能的结构。没有办法自动确定什么应该是记录,什么应该是列。即使是相同的 XML 也可能因不同的目的而进行不同的解析。您需要提前建立一些规则 - 并且,这些规则必然只适用于具有相同或相似结构的 XML 文档。 @michael.hor257k,感谢您的回复,但是 MS Excel 如何做到这一点 我不知道(我不使用 Excel)。 【参考方案1】:尝试以下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
class Program
const string INPUT_FILENAME = @"c:\temp\test.xml";
const string OUTPUT_FILENAME = @"c:\temp\test.csv";
static void Main(string[] args)
StreamWriter writer = new StreamWriter(OUTPUT_FILENAME);
string[] headers = "Name", "Address", "BillMonth", "BillUnit","PaymentMonth", "PaymentAmount";
writer.WriteLine(string.Join(",", headers));
XDocument doc = XDocument.Load(INPUT_FILENAME);
foreach (XElement bill in doc.Descendants("Bill"))
string name = (string)bill.Descendants("Name").FirstOrDefault();
string address = (string)bill.Descendants("Address").FirstOrDefault();
foreach(XElement billHistoryRow in bill.Descendants("BillHistoryRow"))
string billMonth = (string)billHistoryRow.Descendants("BillMonth").FirstOrDefault();
string billUnit = (string)billHistoryRow.Descendants("BillUnit").FirstOrDefault();
writer.WriteLine(string.Join(",", new string[] name, address, billMonth, billUnit ));
foreach (XElement paymentHistoryRow in bill.Descendants("PaymentHistoryRow"))
string paymentMonth = (string)paymentHistoryRow.Descendants("PaymentMonth").FirstOrDefault();
string paymentAmount = (string)paymentHistoryRow.Descendants("PaymentAmount").FirstOrDefault();
writer.WriteLine(string.Join(",", new string[] name, address, "", "", paymentMonth, paymentAmount ));
writer.Flush();
writer.Close();
【讨论】:
以上是关于XML 到 CSV 的转换,如 MS Excel的主要内容,如果未能解决你的问题,请参考以下文章