在使用PowerShell正确的顺序解析XML的childNodes

时间:2019-01-31 18:26:39

标签: xml powershell nodes export-csv

我有一个具有多个节点的XML文件,但是并不是每个子节点都在每个节点中(不是100%我正确地使用了该术语)。我需要将子节点导出到CSV作为列标题。如果第一个节点缺少子节点,那么该子节点将不包含在标头中,并且不会提取数据。

示例:

<data>
    <row>
        <TEST_REF_ID>10001001</TEST_REF_ID>
        <TEST_FIRST_NAME>Samuel</TEST_FIRST_NAME>
        <TEST_LAST_NAME>Adams</TEST_LAST_NAME>
        <TEST_SEX>M</TEST_SEX>
        <TEST_BIRTHDATE>01/01/2001</TEST_BIRTHDATE>
    </row>
    <row>
        <TEST_REF_ID>20002002</TEST_REF_ID>
        <TEST_FIRST_NAME>John</TEST_FIRST_NAME>
        <TEST_MIDDLE_NAME>R</TEST_MIDDLE_NAME>
        <TEST_LAST_NAME>Smith</TEST_LAST_NAME>
        <TEST_SEX>M</TEST_SEX>
        <TEST_BIRTHDATE>01/01/1999</TEST_BIRTHDATE>
        <TEST_SSN>123456789</TEST_SSN>
    </row>
</data>

如果我这样做:

#Location of XML Data is in a URL
[xml]$export = Invoke-WebRequest -Uri $url -Credential $credential
$export.data.row | Export-Csv "C:\test.csv" -NoTypeInformation

列TEST_MIDDLE_NAME和TEST_SSN不会包含在CSV中。

如果我这样做:

$columns = 'TEST_REF_ID', 'TEST_FIRST_NAME', 'TEST_MIDDLE_NAME',
           'TEST_LAST_NAME', 'TEST_SEX', 'TEST_BIRTHDATE', 'TEST_SNN'
[xml]$export = Invoke-WebRequest -Uri $url -Credential $credential
$export.data.row |
    Select-Object $columns |
    Export-Csv "C:\test.csv" -NoTypeInformation

所有的列都包含只要我知道他们是前手的东西。如果列名更改,则不会包含该列,并且我输入的列不正确也将没有数据。

如果我这样做:

#Location of XML Data is in a URL
[xml]$export = Invoke-WebRequest -Uri $url -Credential $credential
$export.SelectNodes("data/row/*") | Select-Object -Expand Name -Unique

它将为我提供所有列名,这些列名可以用作标题,但不会以正确的顺序提供给我。这让他们回来,他们被检索的顺序,所以在这种情况下,它会返回:TEST_REF_ID,TEST_FIRST_NAME,TEST_LAST_NAME,TEST_SEX,TEST_BIRTHDATE,TEST_MIDDLE_NAME,TEST_SNN

它将连续返回第一个集合,然后将缺少的两个集合添加到列表末尾。我需要按照节点中显示的正确顺序将它们拉回。

我希望所有有道理,使用$Column方法确实做到这一点正是我需要的,但它打破,如果改变与做出来的我的知识,我希望能补救这种可能性,如果可能的。

0 个答案:

没有答案