2014-06-21 40 views
0

我需要創建一個Ant任務來在.txt文件的開頭和結尾添加行。當我添加的內容包含CDATA時,如何使用Ant回顯任務追加到文件?

我需要把它添加到每個文件的開頭:

<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[ 

我需要把它添加到每個文件的結尾:

></ac:plain-text-body></ac:structured-macro><p>&nbsp;</p><p>&nbsp;</p><p><ac:structured-macro ac:name="anchor"><ac:parameter ac:name="">_GoBack</ac:parameter></ac:structured-macro></p><p>&nbsp;</p><p>&nbsp;</p> 

我明白,我也許可以使用回聲將這些附加到文件。不過看起來好像![CDATA是你如何將內容添加爲代碼而不是在Ant腳本中執行它的任何部分。問題是我需要添加的片段包含![CDATA。

也就是說,我需要一個文件在上面的兩行,逐字添加到它的末尾。有人可以解釋如何做到這一點,如果不回聲,有沒有其他的方式?

我是新來的Ant,但本週我創建了一些其他Ant任務的構建文件,完美地工作。

感謝

更新:爲了闡述,這裏有我需要什麼作爲結果一個簡單的例子:

<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[ 

<!DOCTYPE html 
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html> 

</html> 

]]></ac:plain-text-body></ac:structured-macro><p>&nbsp;</p><p><ac:structured-macro ac:name="anchor"><ac:parameter ac:name="">_GoBack</ac:parameter></ac:structured-macro></p><p>&nbsp;</p><p>&nbsp;</p> 

我創造什麼是創造合流頁文本文件。開頭和結尾部分在Confluence中創建一個「HTML Include Macro」,它允許我使用HTML,而不是Confluence使用的完全不同的系統。在上面的例子中,在<html></htmL>之間是我所有正常的HTML頁面標記所在的地方。

如果我在這裏有一個.txt文件放在一個Confluence文件夾中,它會創建一個帶有框的Confluence頁面,其中可以使用HTML。

什麼我的XML發佈(氧氣)輸出是與<!DOCTYPE html開始,以</html>

+0

難道你不希望該部分在末尾添加以']]>'開頭,以便將文件內容包裝在CDATA部分中嗎? (CDATA部分以'<![CDATA ['開始並且以']]>'結尾)。 – matt

+0

謝謝 - 如果我理解正確,那麼不。請參閱上面我添加的示例,但要確定我正在理解您要求的內容。 – user3762977

+0

所以這只是當我嘗試使用Ant追加這些新的部分時,我遇到了Ant,將它們中的一部分視爲代碼而不是將它們附加到文件中。 – user3762977

回答

2

這不是結束部分只是CDATA將在這裏產生的問題,如果您嘗試包括在部分中的所有XML語法你只是想看待文字,那麼你的build.xml將無效。

例如,只看文本,你想添加到文件的開頭,但沒有<!CDATA[。您可以使用concat任務這一點,第一次嘗試可能是這樣的:

<concat destfile="target.xml> 
    <string><ac:structured-macro ac:name="html"><ac:plain-text-body></string> 
    <file file="generated-doc.html"/> 
</concat> 

這是無效的,你會得到一個錯誤(類似於The prefix "ac" for element "ac:structured-macro" is not bound.),因爲Ant的XML解析器正試圖解釋標籤作爲構建文件的一部分,而不是將文本數據複製到目標中。

解決方案是轉義的內容,以便它不被解析爲XML。要做到這一點的方法之一是&amp;替換任何<&lt;任何&

<concat destfile="target.xml> 
    <string>&lt;ac:structured-macro ac:name="html">&lt;ac:plain-text-body></string> 
    <file file="generated-doc.html"/> 
</concat> 

您可以將這個想法擴展到包括<![CDATA[內容,只是逃避< S:

<concat destfile="target.xml> 
    <string>&lt;ac:structured-macro ac:name="html">&lt;ac:plain-text-body>&lt;![CDATA[</string> 
    <file file="generated-doc.html"/> 
</concat> 

這可能會有點笨拙,因此解決方案是使用CDATA section,以便在本節內部不必轉義<&,它們不會被視爲XML標記:

<concat destfile="target.xml> 
    <string><![CDATA[<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[]]></string> 
    <file file="generated-doc.html"/> 
</concat> 

請注意,內部的<![CDATA[本身已被轉義,因爲它位於CDATA部分內。從開頭<![CDATA[到結束]]>的任何內容都會被轉義。

事實上,它是關閉]]>,你需要添加到文件的最後導致更大的問題。如果我們試圖重複我們上面所做的末端部分它可能看起來像這樣(包括起始部分,在那裏我已經縮短爲清晰起見,結束段):

<concat destfile="target.xml> 
    <string><![CDATA[<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[]]></string> 
    <file file="generated-doc.html"/> 
    <string><![CDATA[]]></ac:plain-text-body></ac:structured-macro>]]></string> 
</concat> 

這是錯的,因爲CDATA部分立即被我們希望作爲內容的一部分的]]>關閉。作爲CDATA部分的一部分,無法將]]>轉義。這一輪的一種方法是使用&lt;型逃逸,而不是使用CDATA的:

<string>]]&gt;&lt;/ac:plain-text-body>&lt;/ac:structured-macro></string> 

請注意,我們也有&gt;更換>]]> - 通常你不需要更換>,但是當它看起來像你所做的]]>

另一種方法是將]]>分成兩部分,每部分放在不同的CDATA部分。這有點麻煩,但允許我們在字符串的其餘部分保留<。這有效的方法是以]]結尾的一個部分,然後緊接着另一個部分以>開始。這應該是這樣的:

<concat destfile="target.xml> 
    <string><![CDATA[<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[]]></string> 
    <file file="generated-doc.html"/> 
    <string><![CDATA[]]]]><![CDATA[></ac:plain-text-body></ac:structured-macro>]]></string> 
</concat> 

在這種情況下,由於]]>是在內容字符串的開始,最乾淨的結果可能是兩個逃跑的風格結合起來:

<concat destfile="target.xml> 
    <string><![CDATA[<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[]]></string> 
    <file file="generated-doc.html"/> 
    <string>]]&gt;<![CDATA[</ac:plain-text-body></ac:structured-macro>]]></string> 
</concat> 

其他您需要注意的問題是文件內容本身是否包含CDATA部分,因爲關閉]]>會關閉外部部分。如果可能,您需要過濾文件內容以將]]>替換爲]]]]><![CDATA[>

+0

這對我來說是一個巨大的教育,也是一個解決方案 - 經過一番小小的嘗試和幾次嘗試之後,我根據您的最終示例整理的東西現在完美無缺。非常感謝。 – user3762977

0
  • 築巢<![CDATA[..]]>:中]]>第一次出現將關閉最<![CDATA[

因此,你需要使用<![CDATA[插入字符兩]]>部分,使他們不被解析在一起造成<![CDATA[結束。對於如:

<![CDATA[.. <ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[... ..... ]]> <![CDATA[]]]]> <![CDATA[>]]></ac:plain-... ... <p>&nbsp;</p><p>&nbsp;</p>
]]>

這裏<![CDATA[ ]] ]]> <![CDATA[ > ]]>將導致]]>插入txt文件。

  • 以追加到文件中,我認爲最簡單的辦法是內concat使用header, footer嵌套元素。檢查HERE,它也包含一個例子。
相關問題