如何将XML文件转换为CSV列表?Linq方案失效求助
如何将XML文件转换为指定格式的CSV/表格?
我尝试用Linq实现XML转CSV,但没能成功。我的XML文件路径是C:\temp\company_userlist.xml,内容如下:
<?xml version="1.0" encodCompany="utf-8"?> <VShell Version="4.0"> <VirtualRoots Type="subkey"> <VirtualRoot Type="subkey"> <Path Type="strCompany"></Path> <Alias Type="strCompany"></Alias> <Comment Type="strCompany"></Comment> <MigratedPermissions Type="dword">2</MigratedPermissions> <Users Type="array"/> </VirtualRoot> <VirtualRoot Type="subkey"> <Path Type="strCompany">D:\company_SFTP\files\Company-a</Path> <Alias Type="strCompany">CompanyA</Alias> <Comment Type="strCompany"></Comment> <MigratedPermissions Type="dword">2</MigratedPermissions> <Users Type="array"> <Item Type="strCompany">Company_DOMAIN\SFTP Users Company Root Users,allow,use read write deletefile list create deletedir</Item> <Item Type="strCompany">Company_DOMAIN\FTP-1,allow,use read write deletefile list create deletedir</Item> <Item Type="strCompany">Company_DOMAIN\FTP-2,allow,use read write deletefile list create deletedir</Item> <Item Type="strCompany">Company_DOMAIN\FTP-ADMIN,allow,use read write deletefile list create deletedir</Item> </Users> </VirtualRoot> <VirtualRoot Type="subkey"> <Path Type="strCompany">D:\company_SFTP\files\Company-AB1</Path> <Alias Type="strCompany">ADMINISSUER</Alias> <Comment Type="strCompany"></Comment> <MigratedPermissions Type="dword">2</MigratedPermissions> <Users Type="array"> <Item Type="strCompany">Company_DOMAIN\SFTPDefaultIssuerRO,allow,use read list</Item> </Users> </VirtualRoot> <VirtualRoot Type="subkey"> <Path Type="strCompany">D:\company_SFTP\files\Company-GB3</Path> <Alias Type="strCompany">XYZ3</Alias> <Comment Type="strCompany"></Comment> <MigratedPermissions Type="dword">2</MigratedPermissions> <Users Type="array"> <Item Type="strCompany">Company_DOMAIN\FTPxyz3,allow,use read write deletefile list create deletedir</Item> </Users> </VirtualRoot> <VirtualRoot Type="subkey"> <Path Type="strCompany">D:\company_SFTP\files\Company-RT4</Path> <Alias Type="strCompany">DFG-G</Alias> <Comment Type="strCompany"></Comment> <MigratedPermissions Type="dword">2</MigratedPermissions> <Users Type="array"> <Item Type="strCompany">Company_DOMAIN\FTPABC,allow,use read write deletefile list create deletedir</Item> </Users> </VirtualRoot> <Install Type="subkey"> <MainDirectory Type="strCompany">C:\Program Files\VanDyke Software\VShell\</MainDirectory> </Install> </VShell>
我期望转换为以下格式的表格(或CSV):
| Alias Type | Item Type | Path type |
|---|---|---|
| CompanyA | Company_DOMAIN\SFTP Users Company Root Users | D:\company_SFTP\files\Company-a |
| CompanyA | Company_DOMAIN\FTP-1 | D:\company_SFTP\files\Company-a |
| CompanyA | Company_DOMAIN\FTP-2 | D:\company_SFTP\files\Company-a |
| CompanyA | Company_DOMAIN\FTP-ADMIN | D:\company_SFTP\files\Company-a |
| ADMINISSUER | Company_DOMAIN\SFTPDefaultIssuerRO | D:\company_SFTP\files\Company-AB1 |
| XYZ3 | Company_DOMAIN\FTPxyz3 | D:\company_SFTP\files\Company-GB3 |
| DFG-G | Company_DOMAIN\FTPABC | D:\company_SFTP\files\Company-RT4 |
解决方案
可以用C#的Linq to XML实现,核心是遍历每个VirtualRoot节点,提取对应的Alias、Path,再拆分Item中的用户信息(取第一个逗号前的内容),最后输出为CSV或表格。
代码实现
using System; using System.IO; using System.Linq; using System.Xml.Linq; class Program { static void Main() { // 加载XML文件 var xml = XDocument.Load(@"C:\temp\company_userlist.xml"); // 筛选有用户的VirtualRoot节点,提取所需数据 var records = from vr in xml.Descendants("VirtualRoot") let alias = vr.Element("Alias")?.Value let path = vr.Element("Path")?.Value where !string.IsNullOrEmpty(alias) && !string.IsNullOrEmpty(path) from item in vr.Descendants("Item") let user = item.Value.Split(',')[0] // 拆分Item内容,取第一个部分 select new { Alias = alias, User = user, Path = path }; // 输出为CSV var csvLines = new[] { "Alias Type,Item Type,Path type" } .Concat(records.Select(r => $"{r.Alias},{r.User},{r.Path}")); File.WriteAllLines(@"C:\temp\company_userlist.csv", csvLines); // 如果要在控制台输出表格形式 Console.WriteLine("| Alias Type | Item Type | Path type |"); Console.WriteLine("| :---: | :---: | :---: |"); foreach (var record in records) { Console.WriteLine($"| {record.Alias} | {record.User} | {record.Path} |"); } } }
代码说明
- 加载XML:使用
XDocument.Load读取指定路径的XML文件; - 筛选有效节点:只处理有非空
Alias和Path的VirtualRoot,跳过空节点; - 拆分用户信息:每个
Item的值用逗号分割,取第一个元素作为用户名; - 输出结果:既可以生成CSV文件,也能在控制台打印表格。
内容的提问来源于stack exchange,提问作者Dan Goodwin
相关产品推荐
相关产品推荐

