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

PowerShell生成XML时<>字符自动编码问题求助

问题原因

你遇到的<、>被转义成&lt;、&gt;的问题,本质是直接将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:45:41