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

PowerShell从分离的XML内部命名空间取值异常问题排查

问题分析与解决

你的问题不是命名空间理解错误,而是XPath路径使用不当导致的:当你在单个DataSet节点上调用SelectSingleNode("//ns1:TimeStamp/ns2:Time")时,//表示从整个XML文档的根节点开始全局搜索,而非从当前DataSet节点的上下文里查找,所以每次都会返回文档中第一个匹配的Time节点值。

修正方案

把XPath里的//改成相对路径(直接写子节点路径,或用./明确表示当前节点),这样就会从当前DataSet节点内部查找对应的子节点:

修正后的PowerShell脚本

Set-Location $PSScriptRoot
[Xml]$XMLData = Get-Content "nsTest.xml"

$nsmgr = New-Object System.Xml.XmlNamespaceManager($XMLData.NameTable)
$nsmgr.AddNamespace("ns1", "example.com\ns1")
$nsmgr.AddNamespace("ns2", "example.com\ns2")

$DataSets = $XMLData.SelectNodes("//ns1:Root/ns1:DataSet", $nsmgr)

Write-Host ("The number of items in the dataset is: " + $DataSets.Count)

# 使用相对路径,从当前DataSet节点内部查找
Write-Host ("DataSets [0] is: " + $DataSets[0].SelectSingleNode("ns1:TimeStamp/ns2:Time", $nsmgr).InnerText)
Write-Host ("DataSets [1] is: " + $DataSets[1].SelectSingleNode("ns1:TimeStamp/ns2:Time", $nsmgr).InnerText)

Write-Host $DataSets[0].InnerXml
Write-Host $DataSets[1].InnerXml

运行结果

The number of items in the dataset is: 2
DataSets [0] is: 2023-06-01T08:00:00
DataSets [1] is: 2024-07-02T08:00:00
<ns1:TimeStamp xmlns:ns1="example.com\ns1"><ns2:Time xmlns:ns2="example.com\ns2">2023-06-01T08:00:00</ns2:Time></ns1:TimeStamp>
<ns1:TimeStamp xmlns:ns1="example.com\ns1"><ns2:Time xmlns:ns2="example.com\ns2">2024-07-02T08:00:00</ns2:Time></ns1:TimeStamp>

关键知识点

  • //在XPath中是全局搜索,会忽略当前节点的上下文,遍历整个文档查找匹配节点
  • 相对路径(直接写子节点路径或用./开头)是从当前节点的子节点开始查找,符合你遍历每个DataSet节点并提取内部值的需求
  • 你之前对命名空间的配置是正确的,不需要改用local-name()的方式

内容的提问来源于stack exchange,提问作者jwitt98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:07:23