如何在PowerShell中使用XmlWriter()正确创建指定格式的XML文件
故障原因
所有异常和输出不符合预期的问题核心来自3个点:
- 变量名拼写错误:初始化时创建的XmlWriter对象变量是
$XmlWriter,但写入<Item>起始标签、写入version属性时,调用的是拼写错误的$xmlWrite(变量名末尾少了字母r)。PowerShell会将不存在的变量识别为$null,这两行代码实际完全没有执行。 - 当你用正确的变量名
$xmlWriter写入<Name>元素时,XmlWriter默认将其判定为文档根元素,写完后直接进入根元素闭合状态,后续再写入同级的<GUID>元素就触发了状态不合法的报错。 - 未显式配置XmlWriter参数:默认配置会自动输出XML声明头,且默认一致性级别会强制要求单根元素的标准文档结构;缩进未生效也是因为写入流程被笔误打乱,根本没有走到按配置缩进根节点子元素的步骤。另外你写入的version属性值为
"1.0",和预期要求的"1"不匹配。
正确实现代码
# 初始化XmlWriter配置 $xmlsettings = New-Object System.Xml.XmlWriterSettings $xmlsettings.Indent = $true $xmlsettings.IndentChars = " " # 配置为2空格缩进,和预期格式对齐 $xmlsettings.OmitXmlDeclaration = $true # 关闭自动生成的XML声明头 $xmlsettings.ConformanceLevel = [System.Xml.ConformanceLevel]::Auto # 初始化写入实例,全程保持变量名拼写一致 $xmlWriter = [System.XML.XmlWriter]::Create("$PSScriptRoot\Myproject.xml", $xmlsettings) # 写入根节点及子元素 $xmlWriter.WriteStartElement("Item") $xmlWriter.WriteAttributeString("version", "1") # 属性值与预期一致为"1" $xmlWriter.WriteElementString("Name", $myProject) # 直接使用你已定义的项目名变量即可 $xmlWriter.WriteElementString("GUID", (New-Guid).Guid.ToUpper()) # 闭合根节点 $xmlWriter.WriteEndElement() # 刷新并关闭写入流 $xmlWriter.Flush() $xmlWriter.Close()
验证结果
运行上述代码后,生成的Myproject.xml内容与预期完全一致:
<Item version="1"> <Name>Myproject</Name> <GUID>4821CC01-CDB0-4FD7-9F1E-0B1EDF32ACE9</GUID> </Item>
注意事项
- PowerShell默认不强制要求提前声明变量,调用.NET对象时务必核对变量名拼写,避免单个字符错误导致整个写入逻辑完全偏离预期。
- 若不需要XML声明头,必须显式将
$xmlsettings.OmitXmlDeclaration设为$true,即使不手动调用WriteStartDocument(),XmlWriter也会在首次写入元素时自动补全声明。 - 可通过
$xmlsettings.IndentChars自定义缩进字符,默认使用4空格缩进,可根据格式需求自行调整。
内容的提问来源于stack exchange,提问作者user19418817
相关产品推荐
相关产品推荐

