【问题标题】:Updating XML with namespace with xmlstarlet 1.6.1使用 xmlstarlet 1.6.1 更新带有命名空间的 XML
【发布时间】:2016-05-24 07:28:24
【问题描述】:

我正在尝试使用 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 中删除命名空间定义,并使用以下语句:

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 的问题。 因为我不知道如果我删除命名空间声明会发生什么,我想保留它。

【问题讨论】:

    标签: xml xml-namespaces wildfly-8 xmlstarlet


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      从 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。更方便的解决方案

      XML 文档也可以使用不同的命名空间前缀,在任何 文档中的元素。为了处理更大的命名空间 轻松,XMLStarlet(1.2.1+ 版本)将使用命名空间前缀 在输入文档的根元素上声明。默认 命名空间将绑定到前缀“_”和“DEFAULT”(在版本中 1.5.0+)。

      【讨论】:

        猜你喜欢
        • 2021-07-28
        • 1970-01-01
        • 2018-12-20
        • 2013-06-17
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多