我需要创建一个Ant任务来在.txt文件的开头和结尾添加行。
我需要将其添加到每个文件的开头:
<ac:structured-macro ac:name="html"><ac:plain-text-body><![CDATA[
我需要将其添加到每个文件的末尾:
></ac:plain-text-body></ac:structured-macro><p> </p><p> </p><p><ac:structured-macro ac:name="anchor"><ac:parameter ac:name="">_GoBack</ac:parameter></ac:structured-macro></p><p> </p><p> </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> </p><p><ac:structured-macro ac:name="anchor"><ac:parameter ac:name="">_GoBack</ac:parameter></ac:structured-macro></p><p> </p><p> </p>
我正在创建的是在Confluence中创建页面的文本文件。开始和结束部分在Confluence中创建一个“HTML Include Macro”,它允许我只使用HTML,而不是Confluence使用的完全不同的系统。在上面的示例中,<html>
和</htmL>
之间是我的所有常规HTML页面标记所在的位置。
如果我在这里的.txt文件放在Confluence文件夹中,它会创建一个带有框的Confluence页面,在其中可以使用HTML。
我的XML出版物(来自Oxygen)输出的是以<!DOCTYPE html
开头并以</html>
答案 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。一种方法是将<
替换为<
,将&
替换为&
:
<concat destfile="target.xml>
<string><ac:structured-macro ac:name="html"><ac:plain-text-body></string>
<file file="generated-doc.html"/>
</concat>
您可以将此想法扩展到包含<![CDATA[
的内容,只需转义<
s:
<concat destfile="target.xml>
<string><ac:structured-macro ac:name="html"><ac:plain-text-body><![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部分内。 1}}开头的任何内容都会被转义。
实际上,您需要在文件末尾添加导致更大问题的结束<![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
中的<string>]]></ac:plain-text-body></ac:structured-macro></string>
替换为>
- 通常您不需要替换]]>
,但当它显示为{{}时1}}你这样做。
另一种方法是将>
分成两个,每个都在不同的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>]]><![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> </p><p> </p>
强>
此处]]>
将导致<![CDATA[ ]] ]]> <![CDATA[ > ]]>
插入到txt文件中。
]]>
中的header, footer
嵌套元素。检查 HERE ,它也包含一个示例。