PowerShell读取XML中SolutionPath节点内容到变量的方法
PowerShell读取XML节点内容的正确方法
问题场景
已通过以下命令读取XML文件:
[xml]$xml = Get-Content -Path '.\AppInfo.xml'
需要获取目标节点SolutionPath的内容(值为C:\Users\Public\Documents\Projects\Programm\),但错误尝试了带命名空间的写法,寻求正确实现方式。
目标XML内容
<?xml version="1.0"?> <ProjectRuntimeInfo xmlns:xsd="http://www.test.org/20/test" xmlns:xsi="http://www.test.org/20/test"> <Guid>37968228-1bc9-4b84-9eaa-cf0b7ef1c70e</Guid> <FileVersion>8.05.5006.24</FileVersion> <LastFullPublishDate>2023-10-06T14:00:01.8704004+02:00</LastFullPublishDate> <SolutionPath>C:\Users\Public\Documents\Projects\Programm\</SolutionPath> <SolutionName>Produktion</SolutionName> <LastUser>Administrator</LastUser> <MasterProjekt>Produktion</MasterProjekt> </ProjectRuntimeInfo>
错误尝试的写法
$xml.ProjectRuntimeInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".SolutionPath
正确实现方法
直接层级访问(推荐)
你的XML仅定义了命名空间前缀,但目标节点SolutionPath并不属于任何带前缀的命名空间,因此直接通过对象层级访问即可:
# 获取节点内容并保存到变量 $solutionPath = $xml.ProjectRuntimeInfo.SolutionPath # 验证输出 Write-Host $solutionPath
执行后会输出:C:\Users\Public\Documents\Projects\Programm\
错误原因说明
你之前的写法错误地将XML的命名空间属性直接拼接到PowerShell变量访问路径中,这不符合PowerShell处理XML对象的语法规则。只有当节点属于默认命名空间(即根节点使用xmlns="..."且无前缀)时,才需要额外处理命名空间,当前场景完全不需要。
扩展:处理带默认命名空间的XML(可选)
如果遇到根节点带有默认命名空间的XML(例如<ProjectRuntimeInfo xmlns="http://www.test.org/20/test">),则需要使用Select-Xml搭配命名空间参数:
# 定义命名空间映射 $namespaceMap = @{ns = "http://www.test.org/20/test"} # 定位目标节点 $targetNode = Select-Xml -Xml $xml -XPath "//ns:SolutionPath" -Namespace $namespaceMap # 获取节点内容 $solutionPath = $targetNode.Node.InnerText
内容的提问来源于stack exchange,提问作者Azkaad
相关产品推荐
相关产品推荐

