我正在尝试使用 PowerShell 脚本编辑 xml 文档。
这是 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>libs-release</id>
<username>USERNAME</username>
<password>PASSWORD</password>
</server>
<server>
<id>plugins-release</id>
<username>USERNAME</username>
<password>PASSWORD</password>
</server>
<server>
<id>0eb153056152</id>
<username>USERNAME</username>
<password>PASSWORD</password>
</server>
</servers>
</settings>
这是 PowerShell 脚本。
$file = "C:\Users\XXXXXXXXX\Downloads\config\maven_settings.xml"
[xml]$xml = Get-Content $file
$xml.SelectNodes("//username")
该脚本没有返回任何节点。但是,当我删除标签的属性时<settings>
,它就可以正常工作并返回所需的节点。这是命名空间的问题吗?如何在保留原始 xml 文档中的命名空间属性的同时解决该问题?
答案1
您可以尝试以下操作:
$xml.settings.servers.server.username
但是,正如@Frank Thomas 在评论中所建议的那样,与上述方法相比,Select-Xml cmdlet 更好(您需要层次结构)。
答案2
Frank 和引用“Reddy”的成员所展示的内容(我也在这个回复中提到过,但是在他的帖子发布后就把它撤了出来)是一条谨慎的路线,但是,如果您渴望使用 SelectNodes,那么:
$MyXml.SelectNodes('/*/*/*')
# Results
<#
id username password
-- -------- --------
libs-release USERNAME PASSWORD
plugins-release USERNAME PASSWORD
0eb153056152 USERNAME PASSWORD
#>
($MyXml.SelectNodes('/*/*/*')).username
# Results
<#
username
--------
USERNAME
USERNAME
USERNAME
#>
总而言之。它就像成员引用方法,只是无需明确输入所有成员名称。
答案3
您需要在选择节点\值等之前设置命名空间。
尝试下一步
$Namespace = @{
nsa = ($xmlDoc.GetEnumerator() | ? { -not [string]::IsNullOrEmpty($_.NamespaceURI) } ).NamespaceURI
}
然后
Select-Xml -XPath $xpath -Xml $xmlDoc -Namespace $Namespace
“nsa” - 任何你喜欢的词。使用 SelectNodes 时我不能使用命名空间,尽管 MS 文档中指出了这种过载