使用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="<.*?(<prolog>.*?</prolog>).*?/p>" replace="\1" flags="gs" />
</tokenfilter>
</filterchain>
</concat>
</target>
</project>
它把每個文件的全部內容複製到allMetadata.xml,而不是序言部分。
我已經使用replaceregexp併成功捕獲組了一段時間了,但我想我沒有得到關於tokenfilters如何在這裏工作的信息。
當我在regex101.com中嘗試正則表達式和替換時,正則表達式和替換工作。看來pattern
和replace
這裏應該匹配整個頁面,捕獲組中的prolog部分,並用該組替換整個頁面,然後輸出該頁面。但沒有運氣。我究竟做錯了什麼?
UPDATE
我弄成這樣做不同的方式(過濾只是影響到我想要的XML文件中的代碼,請參見下文),但我只看到了下面的答案,現在我明白爲什麼我的原創的方法不起作用,很高興知道。
我現在這樣做,而不是:
<target name="extract">
<concat destFile="allMetadata_Guide.xml">
<fileset dir=".">
<include name="**/*.dita"/>
</fileset>
<filterchain>
<linecontainsregexp>
<regexp pattern="<othermeta|<title>|content=""/>
</linecontainsregexp>
</filterchain>
</concat>
</target>
我想改造包含othermeta
,或title
,或content=
,線條所以這個現在工作。