2017-03-07 67 views
1

我想以編程方式使用ant腳本刪除一塊XML。我發現了精彩的xmltask任務,但對於我的生活,我無法找到我想要刪除的resource-ref節點。在Ant腳本中查找資源引用XML標記

這是我的XML文檔的一個子部分。這是從web.xml文件使用標準的DTD:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" 
    version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <display-name>Foo</display-name> 

    <resource-ref> 
    <description>Something Clever</description> 
    <res-ref-name>jdbc/foo1</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

    <resource-ref> 
    <description>Reports Database</description> 
    <res-ref-name>jdbc/foo2</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

</web-app> 

我試圖刪除第二個resource-ref塊這樣的:

<project name="test" basedir="." default="fixxml"> 
<taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask"/> 
    <target name="fixxml" description="er doy"> 
    <xmltask source="web.xml" dest="output.xml"> 
     <remove path="/web-app/resource-ref/description[text()='Reports Database']" /> 
    </xmltask> 
    </target> 
</project> 

但是,這是行不通的。我也試過以下remove報表:

<remove path="/web-app/resource-ref[2]" /> 
.... 
<remove path="//description[text()[normalize-space(.)='Reports Database']]"" />  

他們都沒有工作。有沒有人看到我可能做錯了我的查詢?

+0

檢查http://stackoverflow.com/questions/10096332/replacing-an-entire-xml-tag-using-ant – Maverick

+0

謝謝你的建議,但這些選項也沒有爲我工作。 –

回答

0

帕特里斯的答案似乎最能說明問題。 Xpath似乎忽略了我的命名空間。因此,我試着用這些知識和用Java編寫的各種xpath幫助器來擺弄「查詢字符串」。經過一段時間後,我終於放棄了這條道路。

我最終通過執行以下操作解決這個問題:

  1. 編寫shell腳本,刪除XML塊。
  2. 從我的Ant文件中調用該腳本。

請注意,對於我來說,這不是選項A或B--它更像是選項M.但我真的無法真正瞭解Xpath的所有瑕疵以及它如何在流行的Java中實現庫。

1

主要的問題可能是您的web.xml聲明瞭一個名稱空間,但是您的xpath會忽略它。 請參閱:https://stackoverflow.com/a/35778167/366749

另一個問題可能是您的xpath表達式將'description'元素指定爲要刪除的節點,而不是其父節點。

建議編輯(未經測試):

<remove path="path="/*[local-name()='web-app']/*[local-name()='resource-ref'][2]"/> 
+0

感謝您的建議,但這並不適合我。我也嘗試了一些變化無濟於事。 –

+0

你能否提供一些關於它不起作用的細節?也許我們可以修復它,並提供可以幫助其他人的更新。 –

+0

對不起,但我還沒有什麼沒有工作的例子。我想這個問題是,我所嘗試的一切都不起作用,我不知道它有多接近工作。所以我沒有費心去拯救他們。請注意,我確實使用了多種工具來幫助解決這個問題,包括Eclipse中的兩個xpath助手。 –