You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell处理含同名元素的XML转换以导入MS Access的问题

处理XML同名元素并转换为Access兼容XML

需要将XML转换后导入MS Access,其他流程正常,但遍历XML中同名<type>元素时无法将多个值合并,导致输出不符合预期。

简化XML示例

<?xml version="1.0" encoding="utf-8"?>
<data>
<orders>
<order>
<name>1</name>
<type>a</type>
<type>b</type>
</order>
</orders>
</data>

现有PowerShell脚本

using assembly System.Xml.Linq

$inputFilename = "1.xml"
$outputXmlFilename = "2.xml"

$doc = [System.Xml.Linq.XDocument]::Load($inputFilename)
$table = [System.Collections.ArrayList]::new()
$orders = $doc.Descendants("order")

foreach($order in $orders)
{
    $name = $order.Element("name").Value
    $newRow | Add-Member -NotePropertyName name -NotePropertyValue $name       

    $table.Add($newRow) | Out-Null
}

$settings = New-Object System.Xml.XmlWriterSettings
$settings.Indent = $true
$settings.Encoding = [System.Text.Encoding]::UTF8

$writer = [System.Xml.XmlWriter]::Create($outputXmlFilename, $settings)
$writer.WriteStartElement("table")
$table | ForEach-Object {
   $writer.WriteStartElement("row")
   $props = $_.PSObject.Properties
   $props | ForEach-Object {
      $writer.WriteStartElement($_.Name)
      $writer.WriteString($_.Value)
      $writer.WriteEndElement()
   }
   $writer.WriteEndElement()
}
$writer.WriteEndElement()
$writer.Close()

Write-Output "Results saved to $outputXmlFilename"

期望输出

<?xml version="1.0" encoding="utf-8"?>
<table>
  <row>
    <name>1</name>
    <types>a,b</types>
  </row>
</table>

尝试过的无效修改

$mytypes = ""

if ($order.Element("type").Name -eq "type") {
    $mytypes = $mytypes + $order.Element("type").Value
}  

解决方案

问题出在Element()方法只会返回第一个匹配的元素,要获取所有<type>元素,需要使用Elements()方法。修改遍历order的代码块如下:

foreach($order in $orders)
{
    # 初始化新行对象,避免重复修改同一实例
    $newRow = [PSCustomObject]@{}
    
    $name = $order.Element("name").Value
    $newRow | Add-Member -NotePropertyName name -NotePropertyValue $name       

    # 获取当前order下所有type元素,合并值为逗号分隔字符串
    $types = $order.Elements("type").Value -join ","
    $newRow | Add-Member -NotePropertyName types -NotePropertyValue $types

    $table.Add($newRow) | Out-Null
}

关键说明

  1. 每次循环必须初始化$newRow为新的PSCustomObject,防止之前的对象被重复修改
  2. 使用$order.Elements("type")获取当前order节点下所有<type>子元素(区别于Element()仅返回第一个匹配项)
  3. 通过-join ","将多个type值合并为逗号分隔的字符串,添加到newRow的types属性中

修改后的脚本运行后,即可生成符合预期的XML文件,可正常导入MS Access。

内容的提问来源于stack exchange,提问作者loarrin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:02:42