当我添加的内容包含CDATA时,如何使用Ant echo任务追加到文件?

时间:2014-06-21 14:22:56

标签: xml ant

我需要创建一个Ant任务来在.txt文件的开头和结尾添加行。

我需要将其添加到每个文件的开头:

<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>

据我所知,我可以使用echo将这些附加到文件中。但似乎![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中创建页面的文本文件。开始和结束部分在Confluence中创建一个“HTML Include Macro”,它允许我只使用HTML,而不是Confluence使用的完全不同的系统。在上面的示例中,<html></htmL>之间是我的所有常规HTML页面标记所在的位置。

如果我在这里的.txt文件放在Confluence文件夹中,它会创建一个带有框的Confluence页面,在其中可以使用HTML。

我的XML出版物(来自Oxygen)输出的是以<!DOCTYPE html开头并以</html>

结尾的部分

2 个答案:

答案 0 :(得分:2)

这不仅仅是导致问题的CDATA,如果您尝试在您想要视为文本的部分中包含任何XML语法,那么build.xml将无效。< / p>

例如,只查看要添加到文件开头但没有<!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解析器正在尝试将标记解释为构建文件的一部分,而不是要复制到目标中的文本数据。 / p>

解决方案是转义内容,以便不将其解析为XML。一种方法是将<替换为&lt;,将&替换为&amp;

<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[。如果我们尝试重复上面针对结尾部分所做的操作,它可能看起来像这样(包括开始部分,以及我为了清楚起见缩短了结束片段):

]]>

这是错误的,因为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> 。一种方法是使用]]>类型的转义而不是使用]]>

&lt;

请注意,我们还必须将CDATA中的<string>]]&gt;&lt;/ac:plain-text-body>&lt;/ac:structured-macro></string> 替换为> - 通常您不需要替换]]>,但当它显示为{{}时1}}你这样做。

另一种方法是将&gt;分成两个,每个都在不同的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[]]]]><![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>

答案 1 :(得分:0)

  • 用于嵌套<![CDATA[..]]>:第一次出现]]>将关闭最外层<![CDATA[

因此,您需要使用<![CDATA[将字符]]>分成两部分,以便它们不会被解析在一起导致<![CDATA[结束。例如:

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

此处]]>将导致<![CDATA[ ]] ]]> <![CDATA[ > ]]>插入到txt文件中。

  • 要附加到文件,我认为最简单的选择是使用]]>中的header, footer嵌套元素。检查 HERE ,它也包含一个示例。