将XML文件转换为LIST格式(csv文件)

hpxqektj  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(122)

有人知道如何将XML转换为CSV列表吗?我试过使用linq,但由于某种原因,它不适合我。
我有一个文件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>

字符串
我想将上述样本转换成一个列表如下:
| 项目类型|路径类型| Path type |
| --|--| ------------ |
| Company_DOMAIN\SFTP用户公司根用户|D:\company_SFTP\files\Company-a| D:\company_SFTP\files\Company-a |
| 公司_DOMAIN\FTP-1| D:\company_SFTP\files\Company-a| D:\company_SFTP\files\Company-a |
| 公司_DOMAIN\FTP-2| D:\company_SFTP\files\Company-a| D:\company_SFTP\files\Company-a |
| 公司_DOMAIN\FTP-ADMIN| D:\company_SFTP\files\Company-a| D:\company_SFTP\files\Company-a |
| 公司_域\SFTPDefaultIssuerRO| D:\company_SFTP\files\Company-AB1| D:\company_SFTP\files\Company-AB1 |
| 公司_域\FTPxyz3| D:\company_SFTP\files\Company-GB3| D:\company_SFTP\files\Company-GB3 |
| 公司_DOMAIN\FTPABC| D:\company_SFTP\files\Company-RT4| D:\company_SFTP\files\Company-RT4 |

hyrbngr7

hyrbngr71#

首先枚举我们想要从中提取数据的所有<VirtualRoot />元素:

$xml = [xml](Get-Content C:\temp\company_userlist.xml)
$xml.SelectNodes('//VirtualRoot')

字符串
然后我们需要扁平化<Users />子元素,并为每个<Item />子元素创建一个object对象。
我们可以用Select-Object -ExpandProperty执行第一个展平步骤,如下所示:

$xml.SelectNodes('//VirtualRoot') |Select-Object Alias,Path -ExpandProperty Users


现在我们只需要迭代每个<Item />元素并构造一些输出对象,最后得到如下结果:

$objects = $xml.SelectNodes('//VirtualRoot') |Select-Object Alias,Path -ExpandProperty Users |% {
  foreach($item in $_.Item |Where-Object {$_.Item}) {
    [pscustomobject]@{
      'Alias Type' = $_.Alias.InnerText
      'Item Type' = $item.InnerText -replace ',.*$'
      'Path Type' = $_.Path.InnerText
    }
  }
}


... |Where-Object {$_.Item}管道元素将过滤掉包含空<Item />元素的节点,-replace ',.*$'将删除每个包含的权限字符串中第一个逗号之后的所有内容,只留下主体名称。
因此,得到的对象集最终看起来像:

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


漂亮的平面对象可以轻松导出为CSV文件:

$objects |Export-Csv path\to\output.csv -NoTypeInformation

相关问题