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
相关产品推荐
相关产品推荐

