Проблема реализации PowerShell XML для решения CSV - PullRequest
0 голосов
/ 31 октября 2018

Я нашел решение для преобразования 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-файла.

Спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Анализатор xml поместит ваши разделы CDATA в элемент с именем #cdata-section, а не #text. Итак, ваше решение простое:

$xml.Report.Record | Select-Object @(
    @{l="TimeStamp";e={$_.TimeStamp."#cdata-section"}},
    @{l="MessageText";e={$_.MessageText."#cdata-section"}},
    @{l="EventNotificationId";e={$_.EventNotificationId."#cdata-section"}},
    @{l="OperatorText";e={$_.OperatorText."#cdata-section"}},
    @{l="TimeOfAck";e={$_.TimeOfAck."#cdata-section"}},
    @{l="InitDeviceId";e={$_.InitDeviceId."#cdata-section"}}) |
Export-Csv C:\Test\test.csv -NoTypeInformation -Force
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...