Анализировать дочерние узлы XML в правильном порядке с помощью PowerShell
У меня есть 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
Метод делает именно то, что мне нужно, но он ломается, если изменения сделаны без моего ведома, я надеюсь исправить эту возможность, если это возможно.