使用 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+).
我正在尝试使用 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+).