[英]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.