在 ANT 中使用 xmltask 和 xpath 更新带有命名空间前缀的 XML 属性
Update XML attribute with namespace prefix using xmltask and xpath in ANT
我正在尝试检查在处理 xml(更改/更新/解析等)
时如何在 xml 任务中定义 xpath
在查看一些关于类似主题的 Whosebug 帖子时,我只能了解如何 "avoid namespaces" { 通过在每个节点的名称前使用“:” - /:element1/:subelement1/: childelement2/text() } ,当节点没有 xmlns 前缀时。
我的 objective 是更新一个 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 命令,但它不起作用,因为结果为空,这意味着它找不到匹配的节点。
<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>
您没有调用 local-name
函数。在
[local-name='domain']
您查找名为 local-name
的子元素并将其内容与字符串 domain
.
进行比较
此外,在最后两个步骤中,您回退到前缀名称 sec:password-validator
和 sec:name
,这是行不通的。
所以试试这个表达式:
/*[local-name()='domain']/*[local-name()='security-configuration']/*[local-name()='realm']/*[local-name()='password-validator']/*[local-name()='name']/text()`
我正在尝试检查在处理 xml(更改/更新/解析等)
时如何在 xml 任务中定义 xpath在查看一些关于类似主题的 Whosebug 帖子时,我只能了解如何 "avoid namespaces" { 通过在每个节点的名称前使用“:” - /:element1/:subelement1/: childelement2/text() } ,当节点没有 xmlns 前缀时。
我的 objective 是更新一个 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 命令,但它不起作用,因为结果为空,这意味着它找不到匹配的节点。
<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>
您没有调用 local-name
函数。在
[local-name='domain']
您查找名为 local-name
的子元素并将其内容与字符串 domain
.
此外,在最后两个步骤中,您回退到前缀名称 sec:password-validator
和 sec:name
,这是行不通的。
所以试试这个表达式:
/*[local-name()='domain']/*[local-name()='security-configuration']/*[local-name()='realm']/*[local-name()='password-validator']/*[local-name()='name']/text()`