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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:51:57