如何将Dictionary转换为格式规范的XML?
嘿,我懂你想要的是更规整、可读性更强的XML结构——默认的ConvertTo-Xml输出确实把键值对拆成了零散的Property节点,看着有点乱。这里给你两个实用的方法来实现规范的XML转换:
方法1:手动构建XML(最灵活可控)
如果你想要完全自定义XML的结构(比如每个键值对作为独立的Entry节点),手动构建是最优解,能精准控制每一部分的格式:
# 初始化你的字典 $d = New-Object -TypeName 'System.Collections.Generic.Dictionary[int, bool]' $d.Add(1, $true) $d.Add(2, $false) # 创建XML文档和根节点 $xmlDoc = New-Object System.Xml.XmlDocument $root = $xmlDoc.CreateElement("Dictionary") $xmlDoc.AppendChild($root) | Out-Null # 遍历字典的每个键值对,构建节点 foreach ($entry in $d.GetEnumerator()) { # 创建单个键值对的容器节点 $entryNode = $xmlDoc.CreateElement("Entry") # 添加Key子节点 $keyNode = $xmlDoc.CreateElement("Key") $keyNode.InnerText = $entry.Key $entryNode.AppendChild($keyNode) | Out-Null # 添加Value子节点,这里可以统一转成小写的true/false(可选) $valueNode = $xmlDoc.CreateElement("Value") $valueNode.InnerText = $entry.Value.ToString().ToLower() $entryNode.AppendChild($valueNode) | Out-Null $root.AppendChild($entryNode) | Out-Null } # 输出格式化后的XML $xmlDoc.OuterXml
执行后会得到这样的规范XML:
return (<Dictionary><Entry><Key>1</Key><Value>true</Value></Entry><Entry><Key>2</Key><Value>false</Value></Entry></Dictionary> )
如果想要更简洁的格式(把Key作为属性),可以修改循环部分:
foreach ($entry in $d.GetEnumerator()) { $entryNode = $xmlDoc.CreateElement("Entry") $entryNode.SetAttribute("Key", $entry.Key) $entryNode.InnerText = $entry.Value.ToString().ToLower() $root.AppendChild($entryNode) | Out-Null }
对应的输出会变成:
return (<Dictionary><Entry Key="1">true</Entry><Entry Key="2">false</Entry></Dictionary> )
方法2:基于ConvertTo-Xml重构结构
如果你不想从头写XML构建逻辑,也可以先拿到ConvertTo-Xml的原始输出,再用LINQ to XML重构结构:
$d = New-Object -TypeName 'System.Collections.Generic.Dictionary[int, bool]' $d.Add(1, $true) $d.Add(2, $false) # 将默认输出转为XDocument以便操作 $originalXml = [System.Xml.Linq.XDocument]::Parse(($d | ConvertTo-Xml).DocumentElement.OuterXml) # 构建新的根节点 $newRoot = [System.Xml.Linq.XElement]::new("Dictionary") # 提取所有Key和Value节点 $keys = $originalXml.Descendants("Property") | Where-Object { $_.Attribute("Name").Value -eq "Key" } $values = $originalXml.Descendants("Property") | Where-Object { $_.Attribute("Name").Value -eq "Value" } # 配对键值对并添加到新根节点 for ($i=0; $i -lt $keys.Count; $i++) { $entry = [System.Xml.Linq.XElement]::new("Entry", [System.Xml.Linq.XElement]::new("Key", $keys[$i].Value), [System.Xml.Linq.XElement]::new("Value", $values[$i].Value.ToString().ToLower()) ) $newRoot.Add($entry) } # 输出最终XML $newRoot.ToString()
这种方法适合快速修正默认输出的结构,不用从零开始搭建XML框架。
内容的提问来源于stack exchange,提问作者ca9163d9
相关产品推荐
相关产品推荐

