微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Powershell 基于 CSV 列表构建 XML 文件

如何解决使用 Powershell 基于 CSV 列表构建 XML 文件

我有一个布局如下所示的 CSV 文件

Region,Store,Number,IP Address,Store Number
Central,ABC,111,127.0.0.1,1234
Central,CDE,222,5678
Central,EFG,333,9101
Central,HIJ,444,1213
Central,KLM,555,1415

我需要构建一个如下所列的 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_271" class="java.beans.XMLDecoder">
 <object class="client.remoteaccess.model.AddressBookEntry">
  <void property="country">
   <string>USA</string>
  </void>
  <void property="ipAddress">
   <string>127.0.0.1</string>
  </void>
  <void property="name">
   <string>111 ABC</string>
  </void>
  <void property="storeNumber">
   <string>1234</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>[None]</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Imported Entries</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Duplicated Entries</string>
  </void>
 </object>
</java>

我需要从 CSV 文件提取每一行并将其添加到 xml 的中间,应该看起来像这样。

顶部:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_271" class="java.beans.XMLDecoder">

逐行循环浏览 CSV 文件,拉出每个位置,中间部分应该是这样的:

 <object class="client.remoteaccess.model.AddressBookEntry">
  <void property="country">
   <string>USA</string>
  </void>
  <void property="ipAddress">
   <string>127.0.0.1</string>
  </void>
  <void property="name">
   <string>111 ABC</string>
  </void>
  <void property="storeNumber">
   <string>1234</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookEntry">
  <void property="country">
   <string>USA</string>
  </void>
  <void property="ipAddress">
   <string>127.0.0.1</string>
  </void>
  <void property="name">
   <string>222 CDE</string>
  </void>
  <void property="storeNumber">
   <string>5678</string>
  </void>
 </object>

然后添加如下所示的 XML 的底部部分:

 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>[None]</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Imported Entries</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Duplicated Entries</string>
  </void>
 </object>
</java>

目前这是我一直在处理的代码,它循环遍历,但它是我的 CSV 文件中的最后一个存储。在我把这部分做对之前,我还没有担心添加 XML 的顶部或底部

$xmlpath = "test.xml"
Add-Type -AssemblyName System.Web

$Stores = Import-Csv -Path "Stores.csv"

    foreach($Loc in $Stores){
        $StoreName = '{0}' -f $Loc.Store
        $Number = '{0}' -f $Loc.Number
        $IP = '{0}' -f $Loc."IP Address"
        $StoreNum = '{0}' -f $Loc."Store Number"


        try {
$entryTemplate = @'
 <object class="client.remoteaccess.model.AddressBookEntry">
  <void property="country">
   <string>USA</string>
  </void>
  <void property="ipAddress">
   <string>$IP</string>
  </void>
  <void property="name">
   <string>$Number $StoreName</string>
  </void>
  <void property="storeNumber">
   <string>$StoreNum</string>
  </void>
 </object>
'@

$xml = $data | ForEach-Object {
    $ExecutionContext.InvokeCommand.ExpandString($entrytemplate)
}
$xml | Out-File $xmlpath
        }
        catch {
            Write-Output $_.Exception.Message
        }
    }

解决方法

param(
   $csvFileName = "d:\tmp\data.csv"
)

@"
Region,Store,Number,IP Address,Store Number
Central,ABC,111,127.0.0.1,1234
Central,CDE,222,5678
Central,EFG,333,9101
Central,HIJ,444,1213
Central,KLM,555,1415
"@ | out-file $csvFileName

$XMLDocument = [xml]@"
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_271" class="java.beans.XMLDecoder">
</java>
"@

$javaNode = $XMLDocument.SelectSingleNode("/java")

Import-Csv -Path $csvFileName | ForEach-Object {
   $objectNode = $javaNode.AppendChild($XMLDocument.CreateElement("object"))
   $objectNodeClassAtribute = $XMLDocument.CreateAttribute("class")
   $objectNodeClassAtribute.Value = "client.remoteaccess.model.AddressBookEntry"
   $objectNode.Attributes.Append($objectNodeClassAtribute)

   $voidNode = $objectNode.AppendChild($XMLDocument.CreateElement("void"))
   $voidNodePropertyAtribute = $XMLDocument.CreateAttribute("property")
   $voidNodePropertyAtribute.Value = "Country"
   $voidNode.Attributes.Append($voidNodePropertyAtribute)

   $StringNode = $voidNode.AppendChild($XMLDocument.CreateElement("string"))
   $StringNode.InnerText = "USA"
   
   $voidNode = $objectNode.AppendChild($XMLDocument.CreateElement("void"))
   $voidNodePropertyAtribute = $XMLDocument.CreateAttribute("property")
   $voidNodePropertyAtribute.Value = "ipAddress"
   $voidNode.Attributes.Append($voidNodePropertyAtribute)

   $StringNode = $voidNode.AppendChild($XMLDocument.CreateElement("string"))
   $StringNode.InnerText = $_."IP Address"
   
   $voidNode = $objectNode.AppendChild($XMLDocument.CreateElement("void"))
   $voidNodePropertyAtribute = $XMLDocument.CreateAttribute("property")
   $voidNodePropertyAtribute.Value = "name"
   $voidNode.Attributes.Append($voidNodePropertyAtribute)

   $StringNode = $voidNode.AppendChild($XMLDocument.CreateElement("string"))
   $StringNode.InnerText = "{0} {1}" -f $_.Store,$_.Number

   $voidNode = $objectNode.AppendChild($XMLDocument.CreateElement("void"))
   $voidNodePropertyAtribute = $XMLDocument.CreateAttribute("property")
   $voidNodePropertyAtribute.Value = "storeNumber"
   $voidNode.Attributes.Append($voidNodePropertyAtribute)

   $StringNode = $voidNode.AppendChild($XMLDocument.CreateElement("string"))
   $StringNode.InnerText = $_."Store Number"
}
$XMLDocument.Save("d:\tmp\out.xml")
,

你可以做到:

$GlobalXML=@'
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_271" class="java.beans.XMLDecoder">
 {0}
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>[None]</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Imported Entries</string>
  </void>
 </object>
 <object class="client.remoteaccess.model.AddressBookGroup">
  <void property="name">
   <string>Duplicated Entries</string>
  </void>
 </object>
</java>
'@

$PartXML=@'
<object class="client.remoteaccess.model.AddressBookEntry">
  <void property="country">
   <string>USA</string>
  </void>
  <void property="ipAddress">
   <string>{0}</string>
  </void>
  <void property="name">
   <string>{1} {2}</string>
  </void>
  <void property="storeNumber">
   <string>{3}</string>
  </void>
 </object>
'@

$PartText=""

import-csv "C:\temp\test.csv" | %{

$PartText+=$PartXML -f $_."IP Address",$_.Number,$_.Store,$_."Store Number"

}

$GlobalXML -f $PartText| Out-File "c:\temp\result.xml" -encoding UTF8

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。