使用与此类似的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="<.*?(<prolog>.*?</prolog>).*?/p>" replace="\1" flags="gs" />
</tokenfilter>
</filterchain>
</concat>
</target>
</project>
它将每个文件的全部内容放入allMetadata.xml,而不是prolog部分。
我已经成功使用了replaceregexp并成功捕获了一段时间,但我想我还没有得到关于tokenfilters如何在这里工作的信息。
当我在regex101.com中尝试时,正则表达式和替换有效。这里的pattern
和replace
似乎应匹配整个页面,捕获组中的prolog部分,并用该组替换整个页面,然后输出。但没有运气。我做错了什么?
更新
我最终以不同的方式做到这一点(过滤只是影响我想要的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=
的行,以便现在可以使用。
答案 0 :(得分:0)
LineTokenizer是<tokenfilter>
的默认标记生成器。 LineTokenizer一次传递一行到<replaceregex>
。你的正则表达式不会匹配多行的模式。
使用FileTokenizer确保仅为整个输入文件调用<replaceregex>
一次:
<tokenfilter>
<filetokenizer/>
<replaceregex
pattern="<.*?(<prolog>.*?</prolog>).*?/p>"
replace="\1" flags="gs" />
</tokenfilter>