我有一个具有多个节点的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
方法确实做到这一点正是我需要的,但它打破,如果改变与做出来的我的知识,我希望能补救这种可能性,如果可能的。>