我有一个 xml 文件 - 称之为 myXML.xml - 像这样:
<?xml version="1.0" encoding="UTF-8"?>
<Metrics info1="1" info2="2" info3="3" xmlns="http://metrics.sourceforge.net/2003/Metrics-First-Flat">
<Metric id = "NORM" description ="Number of Overridden Methods">
<Values per = "type" total = "135" avg = "0.452" stddev = "0.94" max = "5">
<Value name="a" source ="a.java" package ="package.a" value ="1"/>
<Value name="b" source ="b.java" package ="package.b" value ="34"/>
<Value name="c" source ="c.java" package ="package.c" value ="4"/>
<Value name="d" source ="d.java" package ="package.d" value ="99"/>
<Value name="e" source ="e.java" package ="package.e" value ="99"/>
<Value name="f" source ="f.java" package ="package.f" value ="99"/>
<Value name="g" source ="g.java" package ="package.g" value ="99"/>
</Values>
</Metric>
<Metric id = "NOI" description ="Number of Overridden Methods">
<Values per = "type" total = "135" avg = "0.452" stddev = "0.94" max = "5">
<Value name="a" source ="a.java" package ="package.a" value ="10"/>
<Value name="b" source ="b.java" package ="package.b" value ="340"/>
<Value name="c" source ="c.java" package ="package.c" value ="40"/>
<Value name="d" source ="d.java" package ="package.d" value ="990"/>
</Values>
</Metric>
</Metrics>
因为我必须评估数十个此类文件(如myXML.xml
)超过数十个属性(此处id=NORM
和id=NOI
),所以我尝试在 Apache Ant 中自动执行此操作。
最好的情况是为一个固定文件myXML.xml
(
NORM 1, 34, 4, 99, 99, 99, 99
NOI 10, 340, 40, 990
为了解决这个问题,我想创建一个<property file="metrics.properties"/>
看起来像的属性文件
p_1 = NORM
p_2 = NOI
...
p_N = VG
whereN
是任意的,所以 Ant 必须弄清楚N
(在这里的小例子中N=2
)并创建上面提到的 csv 文件p_i's
。此外,我想我应该将下面的 xquery 重写为文件 ( myXML.xml
)的函数,NORM
并从命令行运行它。但我不知道该怎么做。
以下 xquery 部分做我感兴趣的事情:
declare option db:stripns 'true';
for $x in doc("myXML.xml")/Metrics/Metric[@id="NORM"]/Values//Value/@value
return data($x)
但两者myXML.xml
和NORM
都是固定的,输出只是 1 34 4 99 99 99 99 。我保存了这个文件query.xq
并在 Ant 中运行它:
<target name="ant" depends="#1">
<echo> ant </echo>
<exec executable="${pathToAnt}/basex.bat" dir="${basedir}" error="${basedir}/output/error.txt">
<arg value = "query.xq"/>
<redirector output="${basedir}/output/myXML.csv" alwayslog="true"/>
</exec>
</target>
这就是我所拥有的——与我打算得到的相差甚远。
我希望很清楚我想要达到的目标。我是 xquery 的新手,也是 ant 的新手,我在 Windows 下使用 BaseX(不是必须的),因此这对我来说非常具有挑战性;-)。
非常感谢您提供的任何帮助、提示、问题等。