0

我有一个具有多个节点的 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方法确实可以完全满足我的需要,但是如果在我不知情的情况下进行更改,它就会中断,我希望尽可能地弥补这种可能性。

4

0 回答 0