使用ANT中的xmltask和xpath更新带有名称空间前缀的XML属性

时间:2017-04-12 09:44:50

标签: xml xpath ant xml-namespaces

我正在尝试检查在处理xml(更改/更新/解析等)时如何在xmltask中定义xpath

在检查类似主题的几个stackoverflow帖子时,我只能了解如何避免命名空间" {通过使用":"在每个节点的名称 - /:element1 /:subelement1 /:childelement2 / text()}之前,当一个节点没有xmlns前缀时。

我的目标是更新weblogic xml,它具有为多个属性定义的安全名称空间前缀,例如

    <domain xsi:schemaLocation="http://xmlns.oracle.com/weblogic/security/wls http://xmlns.oracle.com/weblogic/security/wls/1.0/wls.xsd http://xmlns.oracle.com/weblogic/domain http://xmlns.oracle.com/weblogic/1.0/domain.xsd http://xmlns.oracle.com/weblogic/security http://xmlns.oracle.com/weblogic/1.0/security.xsd http://xmlns.oracle.com/weblogic/security/xacml http://xmlns.oracle.com/weblogic/security/xacml/1.0/xacml.xsd" xmlns="http://xmlns.oracle.com/weblogic/domain" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <name>DOMAIN-NAME</name>
      <domain-version>12.1.3.0.0</domain-version>
      <security-configuration>
        <name>DOMAIN-NAME</name>
        <realm>
          <sec:authentication-provider xsi:type="wls:default-authenticatorType">
            <sec:name>DefaultAuthenticator</sec:name>
          </sec:authentication-provider>
          <sec:authentication-provider xsi:type="wls:default-identity-asserterType">
            <sec:name>DefaultIdentityAsserter</sec:name>
            <sec:active-type>AuthenticatedUser</sec:active-type>
          </sec:authentication-provider>
          <sec:password-validator xsi:type="pas:system-password-validatorType" xmlns:pas="http://xmlns.oracle.com/weblogic/security/providers/passwordvalidator">
            <sec:name>SystemPasswordValidator</sec:name>
              <pas:min-password-length>8</pas:min-password-length>
              <pas:min-numeric-or-special-characters>1</pas:min-numeric-or-special-characters>
          </sec:password-validator>
         </realm>
       </security-configuration>
     </domain>

我尝试使用下面的xmltask命令,但它没有工作,因为结果是null,这意味着它找不到匹配的节点。

    <target name="xml_parse">
      <echo> Executing the task for parsing an XML </echo>
      <xmltask source="src/config.xml">
        <copy path="/*[local-name='domain']/*[local-name='security-configuration']/*[local-name='realm']/*[name='sec:password-validator']/*[name='sec:name']/text()" attrValue="true" property="N1"/>
      </xmltask>
      <if>
        <isset property="N1"/>
      <then>
        <echo message="Value of property = ${N1}"/>
      </then>
      <else>
        <echo message="Value of N1 not set"/>
      </else>
      </if>
    </target>

我得到的输出是 -

    $ ant xml_parse -f build.xml
Buildfile: /users/fs1/user1/build.xml

xml_parse:
     [echo]  Executing the task for parsing an XML
     [echo] Value of N1 not set

BUILD SUCCESSFUL
Total time: 0 seconds

关于如何通过上面提到的xml片段解析下面标记中的值的任何建议 -

<sec:name>SystemPasswordValidator</sec:name>

1 个答案:

答案 0 :(得分:1)

您没有调用local-name函数。在

[local-name='domain']

您要查找名为local-name的子元素,并将其内容与字符串domain进行比较。

此外,在最后两个步骤中,您将回退到不起作用的前缀名sec:password-validatorsec:name

所以试试这个表达式:

/*[local-name()='domain']/*[local-name()='security-configuration']/*[local-name()='realm']/*[local-name()='password-validator']/*[local-name()='name']/text()`