You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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 TypeItem TypePath type
CompanyACompany_DOMAIN\SFTP Users Company Root UsersD:\company_SFTP\files\Company-a
CompanyACompany_DOMAIN\FTP-1D:\company_SFTP\files\Company-a
CompanyACompany_DOMAIN\FTP-2D:\company_SFTP\files\Company-a
CompanyACompany_DOMAIN\FTP-ADMIND:\company_SFTP\files\Company-a
ADMINISSUERCompany_DOMAIN\SFTPDefaultIssuerROD:\company_SFTP\files\Company-AB1
XYZ3Company_DOMAIN\FTPxyz3D:\company_SFTP\files\Company-GB3
DFG-GCompany_DOMAIN\FTPABCD:\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} |");
        }
    }
}

代码说明

  1. 加载XML:使用XDocument.Load读取指定路径的XML文件;
  2. 筛选有效节点:只处理有非空Alias和Path的VirtualRoot,跳过空节点;
  3. 拆分用户信息:每个Item的值用逗号分割,取第一个元素作为用户名;
  4. 输出结果:既可以生成CSV文件,也能在控制台打印表格。

内容的提问来源于stack exchange,提问作者Dan Goodwin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:05:12