2015-08-29 29 views
0

使用XML集合的部分文件與此類似:ANT CONCAT僅提取每個文件

<?xml version="1.0" encoding="UTF-8"?> 
<title>xxxx</title> 

<prolog> 
    <metadata> 
     <othermeta name="xxxx/> 
     <othermeta name="xxxx/> 
    </metadata> 
</prolog> 
<p> 
    Blah blah blah blah 
</p> 

(簡化的例子)

我想通過每一個文件,並只提取<prolog></prolog>段成一個輸出文件。

這不是工作:

<project name="export_metadata" default="all" basedir="."> 
<target name="all" depends="extract"/> 

<target name="extract"> 
    <concat destFile="allMetadata.xml"> 
    <fileset dir="."> 
     <include name="**/*.xml"/> 
    </fileset> 
    <filterchain> 
     <tokenfilter> 
      <replaceregex pattern="&lt;.*?(&lt;prolog&gt;.*?&lt;/prolog&gt;).*?/p&gt;" replace="\1" flags="gs" /> 
     </tokenfilter> 
    </filterchain> 
    </concat> 

</target> 
</project> 

它把每個文件的全部內容複製到allMetadata.xml,而不是序言部分。

我已經使用replaceregexp併成功捕獲組了一段時間了,但我想我沒有得到關於tokenfilters如何在這裏工作的信息。

當我在regex101.com中嘗試正則表達式和替換時,正則表達式和替換工作。看來patternreplace這裏應該匹配整個頁面,捕獲組中的prolog部分,並用該組替換整個頁面,然後輸出該頁面。但沒有運氣。我究竟做錯了什麼?

UPDATE

我弄成這樣做不同的方式(過濾只是影響到我想要的XML文件中的代碼,請參見下文),但我只看到了下面的答案,現在我明白爲什麼我的原創的方法不起作用,很高興知道。

我現在這樣做,而不是:

<target name="extract"> 
<concat destFile="allMetadata_Guide.xml"> 
    <fileset dir="."> 
     <include name="**/*.dita"/> 
    </fileset> 
    <filterchain> 
    <linecontainsregexp> 
     <regexp pattern="&lt;othermeta|&lt;title&gt;|content=&quot;"/> 
    </linecontainsregexp> 
    </filterchain> 
</concat> 
</target> 

我想改造包含othermeta,或title,或content=,線條所以這個現在工作。

回答

0

LineTokenizer是<tokenfilter>的默認分詞器。 LineTokenizer一次只傳遞一行到<replaceregex>。你的正則表達式不會匹配多行的模式。

使用FileTokenizer代替,以確保<replaceregex>對整個輸入文件只被調用一次

<tokenfilter> 
    <filetokenizer/> 
    <replaceregex 
     pattern="&lt;.*?(&lt;prolog&gt;.*?&lt;/prolog&gt;).*?/p&gt;" 
     replace="\1" flags="gs" /> 
</tokenfilter>