XML в CSV конвертировать в powershell (Spacewalk) - PullRequest
2 голосов
/ 25 марта 2020

У меня очень мало опыта работы с PowerShell, и мне нужно преобразовать приведенную ниже выдержку из файла XML в форму CSV. Может ли кто-нибудь помочь мне преобразовать этот код?

Это предел того, что я смог сделать до того, как застрял.

$xdoc = new-object System.Xml.XmlDocument
$xdoc.Load("$getUnscheduledErrataPath")

$members = $xdoc.SelectSingleNode("//struct").member.name

$xmldata = ((Select-Xml -Path "$getUnscheduledErrataPath" -XPath "//struct") | ForEach-Object { $_.Node })

XML ввод:

<?xml version="1.0" encoding="UTF-8"?>
    <methodResponse>
        <params>
            <param>
                <value>
                    <array>
                        <data>
                            <value>
                                <struct>
                                    <member><name>id</name><value><i4>26660</i4></value></member>
                                    <member><name>date</name><value><string>9/4/18</string></value></member>
                                    <member><name>advisory_synopsis</name><value><string> ovmd xenstoreprovider  bug fix update</string></value></member>
                                    <member><name>advisory_name</name><value><string>ELBA-2018-4206</string></value></member>
                                    <member><name>advisory_type</name><value><string>Bug Fix Advisory</string></value></member>
                                </struct>
                            </value>
                            <value>
                                <struct>
                                    <member><name>id</name><value><i4>18094</i4></value></member>
                                    <member><name>date</name><value><string>1/29/19</string></value></member>
                                    <member><name>advisory_synopsis</name><value><string> module-init-tools  bug fix update</string></value></member>
                                    <member><name>advisory_name</name><value><string>ELBA-2019-4527</string></value></member>
                                    <member><name>advisory_type</name><value><string>Bug Fix Advisory</string></value></member>
                                </struct>
                            </value>
                        </data>
                    </array>
                </value>
            </param>
        </params>
    </methodResponse>

1 Ответ

2 голосов
/ 25 марта 2020

Чтобы создать что-то, что мы можем существенно преобразовать в CSV, я бы выбрал следующий подход (псевдокод):

foreach <struct>
{
    foreach <member>
    {
        collect <name>, parse <value>
    }

    Convert <member> results to object
}

В PowerShell это будет выглядеть примерно так:

$objects = foreach($struct in $xdoc.SelectNodes('//struct')){
    # Create a dictionary to store the <member> values
    $properties = [ordered]@{}

    # Iterate over <member> child nodes
    foreach($member in $struct.SelectNodes('member')){
        # <name> is easy
        $name = $member.SelectSingleNode('name').innerText

        # for <value> nodes I'm grabbing all ChildNodes and just select the first 1
        $valueNode = $member.SelectSingleNode('value').ChildNodes |Select -First 1

        # Here you could make decisions based on `$valueNode.Name`,
        # like converting <i4> values to an [int] for example
        #
        # But since the purpose is to export to csv, that doesn't make much sense here

        # Add extracted values to dictionary
        $properties[$name] = $valueNode.innerText
    }

    # create object based on extracted properties
    [pscustomobject]$properties
}

# Export resulting objects to CSV
$objects |Export-Csv -Path C:\path\to\output.csv -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...