PowerShell生成XML时<>字符自动编码问题求助
问题原因
你遇到的<、>被转义成<、>的问题,本质是直接将XML格式的字符串赋值给XML节点的属性/文本内容,PowerShell的XML对象会自动对特殊字符进行HTML实体转义——因为它把你传入的字符串当成纯文本处理,而非XML结构。
解决方法
不要用字符串拼接XML内容,改用PowerShell XML对象的原生API创建节点、设置属性,这样能保证XML结构的正确性,不会出现自动转义。
修正后的完整代码
$myitems = @( [pscustomobject]@{AssertName="Joe";TestPass=$true;}, [pscustomobject]@{AssertName="Sue";TestPass=$false;}, [pscustomobject]@{AssertName="Cat";TestPass=$true;} ) # 直接创建XML文档,无需先写入文件再读取 $xml = New-Object System.Xml.XmlDocument $declaration = $xml.CreateXmlDeclaration("1.0", $null, $null) $xml.AppendChild($declaration) | Out-Null # 创建根节点testsuites $testsuites = $xml.CreateElement("testsuites") $xml.AppendChild($testsuites) | Out-Null foreach ($item in $myitems) { # 创建testsuite节点并设置属性 $testsuite = $xml.CreateElement("testsuite") $testsuite.SetAttribute("errors", "0") $testsuite.SetAttribute("failures", if ($item.TestPass) { "0" } else { "1" }) # 根据TestPass动态设置失败数 $testsuite.SetAttribute("id", "0") $testsuite.SetAttribute("name", $item.AssertName) $testsuite.SetAttribute("tests", "1") # 创建testcase子节点并设置属性 $testcase = $xml.CreateElement("testcase") $testcase.SetAttribute("classname", "some.class.name") $testcase.SetAttribute("name", "Test1") $testcase.SetAttribute("time", "123.345000") # 将节点逐层添加到XML结构中 $testsuite.AppendChild($testcase) | Out-Null $testsuites.AppendChild($testsuite) | Out-Null } # 保存XML到指定路径 $xml.Save($path)
关键说明
- 用
CreateElement创建XML节点、SetAttribute设置属性,完全通过XML对象API操作,从根源避免字符串拼接带来的转义和格式错误。 - 修复了原代码中
name="$item.AssertName"单引号包裹导致变量无法解析的问题,直接传入变量值即可。 - 额外优化:根据
TestPass的布尔值动态设置failures属性,更贴合测试结果的实际逻辑。
内容的提问来源于stack exchange,提问作者Heshan
相关产品推荐
相关产品推荐

