Powershell如何将XML文件导出为Excel(CSV)

时间:2015-12-23 13:27:00

标签: xml powershell powershell-v3.0

我想将此xml文件导出为Excel(CSV)。我在网上搜索了一些例子,但我似乎无法找到任何可以帮助我的东西。

我对powershell不满意。

<?xml version="1.0" encoding="UTF-8"?>
<products updated="12/16/2015">
  <product name="office">
    <addresslist type="IPv6">
      <address>2</address>
      <address>256</address>
      <address>434</address>
    </addresslist>
    <addresslist type="IPv4">
      <address>13.107</address>
      <address>13.14/24</address>
    </addresslist>
    <addresslist type="URL">
      <address>*.google</address>
      <address>*.yahoo</address>
      <address>*.some other link</address>
    </addresslist>
  </product>
  <product name="LYO">
    <addresslist type="URL">
      <address>*.rtrt</address>
      <address>eever</address>
    </addresslist>
    <addresslist type="IPv4">
      <address>23.178</address>
      <address>23.18</address>
      <address>23.19</address>
    </addresslist>
    <addresslist type="IPv6">
      <address>2a01:13::/4</address>
      <address>2a01:1</address>
    </addresslist>
  </product>
</products>

这就是我所拥有的,但却没有给出我需要的东西。

[xml]$file = get-content ./O365IPAddresses.xml
$xmlProperties = $file.SelectNodes("/products/product")

    Foreach ($xmlProperty in $xmlProperties) {
        $o = New-Object Object

        Add-Member -InputObject $o -MemberType NoteProperty -Name Name -Value $xmlProperty.name

        foreach ($p in $xmlProperty.addresslist)
        {
            $type += $p.type
            $add += $p.address
        }

        Add-Member -InputObject $o -MemberType NoteProperty -Name Type -Value $type
        Add-Member -InputObject $o -MemberType NoteProperty -Name Address -Value $add

        $type="";
        $add="";

        #Add-Member -InputObject $o -MemberType NoteProperty -Name Name -Value $xmlProperty.name
        $o
    }

    $o="";

这就是我需要输出的代码。

Name    Type    V
Office  IPv4    12111,12121,12,12,1,2,12,1,2,
Office  IPv6    12111,12121,12,12,1,2,12,1,2,
Office  URL google, yahoo
lyo IPv4    12111,12121,12,12,1,2,12,1,2,
lyo IPv6    12111,12121,12,12,1,2,12,1,2,
lyo URL some lyn, yahoo

1 个答案:

答案 0 :(得分:1)

你是在正确的轨道上,但做Add-Member的东西会导致你失败​​。 PowerShell是一种面向对象的语言,所以当你经历一大堆代码时,只需发出和反对就好了,让PowerShell在管道中为你收集它们。

我修改并截断了你的代码。使用此代码:

$xmlProperties = $file.SelectNodes("/products/product")
$o = New-Object Object
    Foreach ($xmlProperty in $xmlProperties) {

        foreach ($p in $xmlProperty.addresslist)
        {
            [pscustomobject]@{Name=$xmlProperty.Name;Type=$p.type;Address=$p.address}

        }

    }

你会得到这个输出:

Name   Type Address                               
----   ---- -------                               
office IPv6 {2, 256, 434}                         
office IPv4 {13.107, 13.14/24}                    
office URL  {*.google, *.yahoo, *.some other link}
LYO    URL  {*.rtrt, eever}                       
LYO    IPv4 {23.178, 23.18, 23.19}                
LYO    IPv6 {2a01:13::/4, 2a01:1}    

您可以将其导入Export-Csv以制作电子表格。

我想提请注意[pscustomobject]符号。这是一个用于创建新对象的PowerShell v3及其简写,它接受一对对象属性和值的键值对。所以,在我们for-each循环的这一点上,我们定义了变量$p,它具有以下值:

type address              
---- -------              
IPv6 {2a01:13::/4, 2a01:1}

我们在这里创建一个新对象,抓取父对象.Name的{​​{1}}属性,然后从我们想要带来的$xmlProperty中选出两个额外值好。

希望这会有所帮助。

如何处理System.String []

如果您的某个属性包含多个值,那么您将在CSV文件中获得奇怪的输出。从本质上讲,PowerShell将扫描输出,并以逗号分隔值格式重新呈现它。当属性具有两个值时,PowerShell会将其列为System.String []或末尾附加$p的完整对象名称,这是数组的表示法(包含多个项目的对象)。

[]