使用xmlstarlet 1.6.1更新带有命名空间的XML

时间:2016-05-24 07:28:24

标签: xml xml-namespaces wildfly-8 xmlstarlet

我正在尝试使用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发生什么,我想保留它。

2 个答案:

答案 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 +)。