使用 PowerShell 脚本的 xml SelectNodes 方法不返回任何节点(命名空间问题?)

使用 PowerShell 脚本的 xml SelectNodes 方法不返回任何节点(命名空间问题?)

我正在尝试使用 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 文档中指出了这种过载

相关内容