使用 xmlstarlet 1.6.1 使用命名空间更新 XML

Updating XML with namespace with xmlstarlet 1.6.1

我正在尝试使用 xmlstarlet 从 Wildfly 集群配置更新主机 -slave.xml。

我正在使用以下语句:

xml ed -N my=urn:jboss:domain:2.2 -u "_:host/management/security-realms/security-realm[@name='UndertowRealm']/server-identities/ssl/keystore/@path" -v "test" Wildfly\wildfly-8.2.0.Final\WildFly-HOST\configuration\host-slave.xml

xml中的命名空间定义:

<host name="172.16.1.11" xmlns="urn:jboss:domain:2.2" >

xml我要修改的部分:

<security-realm name="UndertowRealm">  
    <server-identities>  
        <ssl>  
            <keystore path="D:\wildfly-8.2.0.Final\ssl\wildfly.keystore"  keystore-password="rsaddbTsadYvvMXZ" alias="wildfly"  /> 
        </ssl>  
    </server-identities>  
</security-realm>

但是如果我从 xml 中删除命名空间定义,并使用以下语句:

xml ed -u ":host/management/security-realms/security-realm[@name='UndertowRealm']/server-identities/ssl/keystore/@path" -v "test" Wildfly\wildfly-8.2.0.Final\WildFly-HOST\configuration\host-slave.xml

它按预期工作,因此这不是 XPATH 的问题。 因为我不知道如果我删除命名空间声明,wildfly 会发生什么,所以我想保留它。

问题是您需要使用已声明的前缀(my,您已将其正确映射到默认命名空间 URI)以在 XPath 中引用该命名空间中的元素,例如:

/my:security-realm[@name='UndertowRealm']/my:server-identities/my:ssl/my:keystore/@path

基本上,在声明默认命名空间的元素内,所有没有前缀的元素都被视为在同一默认命名空间中,因此需要使用前缀 my.

进行引用

从 1.2.1 版开始,您可以使用默认命名空间 _
(删除 -N 参数)

xml ed -u "/_:security-realm[@name='UndertowRealm']/_:server-identities/_:ssl/_:keystore/@path" -v "test" Wildfly\wildfly-8.2.0.Final\WildFly-HOST\configuration\host-slave.xml

正如解释的那样here

1.3. A More Convenient Solution

XML documents can also use different namespace prefixes, on any element in the document. In order to handle namespaces with greater ease, XMLStarlet (versions 1.2.1+) will use the namespace prefixes declared on the root element of the input document. The default namespace will be bound to the prefixes "_" and "DEFAULT" (in versions 1.5.0+).