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 }
关键说明
- 每次循环必须初始化
$newRow为新的PSCustomObject,防止之前的对象被重复修改 - 使用
$order.Elements("type")获取当前order节点下所有<type>子元素(区别于Element()仅返回第一个匹配项) - 通过
-join ","将多个type值合并为逗号分隔的字符串,添加到newRow的types属性中
修改后的脚本运行后,即可生成符合预期的XML文件,可正常导入MS Access。
内容的提问来源于stack exchange,提问作者loarrin
相关产品推荐
相关产品推荐

