我正在尝试使用xmlstarlet从Wildfly群集配置更新host-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中删除命名空间defition,并使用以下语句:
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发生什么,我想保留它。
答案 0 :(得分:1)
问题是您需要使用声明的前缀(my
,您正确映射到默认名称空间URI)来引用XPath中该命名空间中的元素,例如:
/my:security-realm[@name='UndertowRealm']/my:server-identities/my:ssl/my:keystore/@path
基本上,在声明默认命名空间的元素中,所有没有前缀的元素都被认为是在同一个默认命名空间中,因此需要使用前缀my
来引用。
答案 1 :(得分:1)
从版本1.2.1开始,您可以使用de default namespace _
(删除-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。更方便的解决方案
XML文档也可以使用不同的名称空间前缀 文件中的元素。为了处理名称空间更大 简单,XMLStarlet(版本1.2.1+)将使用名称空间前缀 在输入文档的根元素上声明。默认 命名空间将绑定到前缀“_”和“DEFAULT”(在版本中) 1.5.0 +)。