ANT concat只提取每个文件的一部分

时间:2015-08-29 21:16:02

标签: regex xml ant

使用与此类似的xml文件集合:

<?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,而不是prolog部分。

我已经成功使用了replaceregexp并成功捕获了一段时间,但我想我还没有得到关于tokenfilters如何在这里工作的信息。

当我在regex101.com中尝试时,正则表达式和替换有效。这里的patternreplace似乎应匹配整个页面,捕获组中的prolog部分,并用该组替换整个页面,然后输出。但没有运气。我做错了什么?

更新

我最终以不同的方式做到这一点(过滤只是影响我想要的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>

我想要转换包含othermetatitlecontent=的行,以便现在可以使用。

1 个答案:

答案 0 :(得分: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>