繁体   English   中英

在 powershell 中将 XML 转换为 CSV (Spacewalk)

[英]XML to CSV convert in powershell (Spacewalk)

我对 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>

为了创建一些我们可以有意义地转换为 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM