在ant脚本中合并xml文件

时间:2014-10-09 03:23:01

标签: xml xpath ant xmltask

有这样的要求:

如果尚未在web.xml中插入以下servlet:

  <servlet>
   <description>My Servlet</description>
   <servlet-name>myServlet</servlet-name>
   <servlet-class>com.tom.servlet.MyServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/servlet/myServlet/*</url-pattern>
  </servlet-mapping>

我在我的蚂蚁脚本中使用XMLTask

尝试了以下脚本,但失败了:

<xmltask source="${env.My_HOME}/WEB-INF/web.xml" dest="${env.My_HOME}/WEB-INF/web.xml" report="false">
        <copy property="servletfound" path="/web-app/servlet[servlet-name='myServlet']/text()" />
        <insert unless="servletfound" path="/web-app/servlet[last()]" position="after">
            <![CDATA[
            <servlet>
   <description>My Servlet</description>
   <servlet-name>myServlet</servlet-name>
   <servlet-class>com.tom.servlet.MyServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/servlet/myServlet/*</url-pattern>
  </servlet-mapping>
        ]]>
        </insert>
    </xmltask>

我的问题是如何检测servlet是否存在,因为我应该避免插入两次。 听起来我的xpath语法不正确。请帮忙。

1 个答案:

答案 0 :(得分:0)

你试过的Xpath:

/web-app/servlet[servlet-name='myServlet']/text()

...返回 <servlet> 的直接子项的文本节点,这些节点在发布的XML示例中不存在。如果您打算返回 <servlet-name> 的直接子项的文本节点,那么XPath应该是这样的:

/web-app/servlet/servlet-name[.='myServlet']/text()