Я нашел решение для преобразования XML в CSV с помощью PowerShell. Я считаю, что он подходит для моих нужд в этом вопросе .
Пример кода решения выглядит следующим образом:
$xml = [xml](Get-Content .\test.xml)
$xml.root.item | Select-Object @(
@{l="short_version";e={$_.short_version."#text"}},
@{l="long_name";e={$_.long_name."#text"}},
@{l="api_name";e={$_.api_name."#text"}},
@{l="long_version";e={$_.long_version."#text"}},
@{l="latest_stable_version";e={$_.latest_stable_version."#text"}},
@{l="automation_backend";e={$_.automation_backend."#text"}},
@{l="os";e={$_.os."#text"}}) |
Export-Csv test.csv -NoTypeInformation
Однако после соответствующих замен для моего исходного XML я просто генерирую CSV со строкой заголовков, за которой следуют строки с запятыми без значений.
Мой исходный XML выглядит так:
<Report>
<Columns>
<Col_Name>TimeStamp</Col_Name>
<Col_Name>MessageText</Col_Name>
<Col_Name>EventNotificationId</Col_Name>
<Col_Name>OperatorText</Col_Name>
<Col_Name>TimeOfAck</Col_Name>
<Col_Name>InitDeviceId</Col_Name>
</Columns>
<Record>
<TimeStamp><![CDATA[10/1/2018 1:34:06.99 PM]]></TimeStamp>
<MessageText><![CDATA[OnLine]]></MessageText>
<EventNotificationId><![CDATA[Path\Text]]></EventNotificationId>
<OperatorText><![CDATA[]]></OperatorText>
<TimeOfAck><![CDATA[1/1/1989]]></TimeOfAck>
<InitDeviceId><![CDATA[Path\Text]]></InitDeviceId>
</Record>
<Record>
~
</Record>
(Я заменил Path \ Text в нескольких местах на усмотрение.)
А мой пробный код с подстановками выглядит так:
$xml = [xml](Get-Content C:\Test\test.xml)
$xml.Report.Record | Select-Object @(
@{l="TimeStamp";e={$_.TimeStamp."#text"}},
@{l="MessageText";e={$_.MessageText."#text"}},
@{l="EventNotificationId";e={$_.EventNotificationId."#text"}},
@{l="OperatorText";e={$_.OperatorText."#text"}},
@{l="TimeOfAck";e={$_.TimeOfAck."#text"}},
@{l="InitDeviceId";e={$_.InitDeviceId."#text"}}) |
Export-Csv C:\Test\test.csv -NoTypeInformation -Force
Что мне нужно изменить, чтобы это решение работало на меня?
Последняя мысль, которая приходит мне в голову сейчас, заключается в том, что проприетарный тип данных CDATA может быть нечитаемым при использовании моего текущего кода. Если это ответственно, я не уверен, как отделить текстовую строку от этого. Кроме того, FWIW, я мог бы дополнительно получить исходные данные в виде HTML-документа, но из моего быстрого исследования оказалось проще написать сценарий преобразования в CSV из исходного XML-файла.
Спасибо.