1

在下面的 ant 脚本片段中,我正在处理一个目录中的所有 conn.xml 文件,以查明是否存在除 MyDB 之外的数据库条目。此代码仅设置最后一个匹配的数据库名称,这仍然可以,因为通常只有一个这样的文件。但我想命名具有此无效条目的确切文件(在所有包含的文件中)。

<xmltask>
   <fileset dir="${srcdir}/../apps" includes="*/conn.xml"/>
   <copy path="//Reference[@name!='MyDB']/@name" attrvalue="true" property="bad_connection_name"/>
</xmltask>

我可以在复制命令的“路径”字段中使用什么参数来打印当前文件名?

4

2 回答 2

2

xmltask copy 的 path 属性仅包含要复制的元素的 XPath 引用。
如果要捕获所有匹配项,则需要为 xmltask 副本设置属性 append,
请参阅xmltask 手册

当设置为 true 时,附加到给定的缓冲区或属性。您只能在创建新属性时追加,因为 Ant 属性是不可变的(即当 XPath 解析为多个文本节点时)

<copy path="//Reference[@name!='MyDB']/@name" attrvalue="true" property="bad_connection_name" append="true"/>

你也可以设置一个propertySeparator, default=','

但是获取所有具有错误连接字符串的文件的更简单的方法是使用带有选择器的文件集,如下所示:

<fileset dir="${srcdir}/../apps" includes="*/conn.xml" id="foo">
 <contains text=" your bad Connection string goes here "/>
</fileset>

<!-- simple echo -->
<echo>${toString:foo}</echo>

<!-- convert to one file one line -->
<pathconvert refid="foo" pathsep="${line.separator}" property="foobar"/>
<!-- echo to ant logger/stdout -->
<echo>${foobar}</echo>
<!-- write to file -->
<echo file="path/to/badconnection.txt">${foobar}</echo>

如果错误的连接字符串不是静态的,请使用containsregexp选择器而不是contains

于 2015-08-28T09:31:55.840 回答
1
<target name="check_connection_violations">
    <xmltask source="${file}">
        <copy path="//Reference[@className='oracle.jdeveloper.db.adapter.DatabaseProvider' and @name!='MyDB']/@name" attrvalue="true" property="bad_connection_name"/>
    </xmltask>
    <if>
        <isset property="bad_connection_name"/>
    <then>
        <echo message="${file} has connection violation due to ${bad_connection_name} entry. ${line.separator}" file="${basedir}/conn_name_violation.txt" append="true"/>
    </then>
    </if>
</target>

以上是新增的目标。这是在循环中调用它的原始片段:

<foreach target="check_connection_violations" param="file">
    <fileset dir="${srcdir}/../apps" includes="*/conn.xml"/>
</foreach>
于 2015-08-28T19:21:45.583 回答