PowerShell如何创建XML文档

PowerShell创建XML最常用可靠方式是[xml]类型加速器配字符串或XmlDocument编程:字符串法适合简单固定结构,XmlDocument法适合复杂动态场景,ConvertTo-Xml仅限PS内部序列化。

PowerShell 创建 XML 文档最常用、最可靠的方式是使用 [xml] 类型加速器配合字符串拼接或 XmlDocument 对象编程构建。直接用字符串生成简单 XML 快速有效,而用 XmlDocument 可以动态添加节点、设置属性、验证结构,适合复杂场景。

用字符串 + [xml] 类型加速器快速创建

适用于结构固定、内容简单的 XML,比如配置片段或测试数据。PowerShell 会自动解析字符串为可操作的 XML 对象:

  • 用 Here-String(@”…“@)保持格式清晰,避免引号转义问题
  • 声明变量后强制转换为 [xml],即可访问 .DocumentElement.FirstChild 等 DOM 属性
  • 注意:XML 声明(如 )非必需,但加上更规范

示例:

$xmlStr = @"


  
  prod_db

"@
$xml = [xml]$xmlStr
$xml.config.server.name # 输出 web01
$xml.config.database.'#text' # 输出 prod_db

用 XmlDocument 对象动态构建(推荐用于复杂逻辑)

适合需循环生成节点、条件插入、设置命名空间或验证格式的场景。比字符串方式更健壮,不易出错:

  • 先创建空 XmlDocument 实例,再用 CreateElementCreateAttribute 等方法逐层构造
  • AppendChildPrependChild 控制节点顺序,SetAttributeNode 添加属性
  • 支持保存到文件:$doc.Save("config.xml")

示例(构建带属性和子节点的配置):

$doc = New-Object System.Xml.XmlDocument
$root = $doc.CreateElement("settings")
$doc.AppendChild($root) | Out-Null

$item = $doc.CreateElement("item")
$attr = $doc.CreateAttribute("id")
$attr.Value = "101"
$item.SetAttributeNode($attr)
$item.InnerText = "Backup Enabled"
$root.AppendChild($item) | Out-Null

$doc.InnerXml # 查看生成结果

用 ConvertTo-Xml(仅限 PowerShell 原生对象序列化)

这个命令不是生成通用 XML,而是将 PowerShell 对象(如哈希表、自定义对象)转为 PowerShell 专用 XML 格式,含 ObjsSObj 等标签,**不适用于与外部系统交互**:

  • 输出结构固定,不可控,且包含类型信息和命名空间
  • 仅适合 PowerShell 进程间临时传递数据(配合 ConvertFrom-Xml
  • 不要用它生成配置文件或 API 请求体

示例(不推荐用于标准 XML 场景):

$data = @{Name="AppServer"; Role="Web"; Status="Online"}
$data | ConvertTo-Xml -NoTypeInformation

保存和验证小技巧

生成 XML 后建议验证格式是否合法,再保存:

  • $xml.Save("out.xml") 直接保存 XmlDocument;用 Out-File -Encoding UTF8 保存字符串(注意 BOM 问题)
  • 检查是否生成成功:if ($xml.DocumentElement) { "Valid" } else { "Parse failed" }
  • 若需 UTF-8 无 BOM,用 [System.Text.UTF8Encoding]::new($false) 配合 Save() 方法