2012-09-11 45 views
0

我有一个XML文件(myxml.xml)这样解析使用Ant和加入路径

<fileset dir ="C:\dir1"> 
    <include name="abc.txt"> 
    <include name ="def.txt"> 
</fileset> 
<fileset dir ="C:\dir2"> 
    <include name="abc2.txt"> 
    <include name ="def2.txt"> 
</fileset> 

我想用我的Ant build.xml来分析此文件,并想要两个txt文件文件集的tag在XML要创建说text1.txt和text2.txt,具有下列内容

text1.txt

C:\dir1\abc.txt 
C:\dir1\def.txt 

text2.txt应该有

C:\dir2\abc2.txt 
C:\dir2\def2.txt 

任何想法,我怎么能做到这一点:)

+0

是否还好添加两个样式表将输出到单独的txt文件,而不是使用xmltask? – randominstanceOfLivingThing

+2

你为什么要使用Ant?用Python,Perl或Powershell等完整的编程语言(因为您使用的是Windows)会不会更好? Ant是一种矩阵依赖语言。它用于构建软件(特别是Java代码)。如果这是build.xml的一部分,我可以理解,但如果这只是试图从XML创建一对文件,那么最好用真正的编程语言。考虑你的要求,如果你需要的话,重新编辑你的问题。 –

+0

@DavidW。 - 是的,这是build.xml的一部分,我需要解析的xml文件也是构建的一部分。 – shruti

回答

0

如果你可以选择在您的build.xml文件<fileset>标签,你可以创建一个包含的内容的文本文件文件集如下。

<target name="create-text1"> 
    <fileset dir="C:\dir1" id="dir1.files"> 
    <include name="abc.txt" /> 
    <include name ="def.txt" /> 
    </fileset> 
    <pathconvert pathsep="${line.separator}" 
     property="text1" refid="dir1.files"/> 
    <echo file="text1.txt" message="${text1}" /> 
</target> 

<target name="create-text2"> 
    <fileset dir="C:\dir2" id="dir2.files"> 
    <include name="abc2.txt" /> 
    <include name ="def2.txt" /> 
    </fileset> 
    <pathconvert pathsep="${line.separator}" 
     property="text2" refid="dir2.files"/> 
    <echo file="text2.txt" message="${text2}" /> 
</target> 
+0

我无法在build.xml中添加目录路径和文件名。我必须从myxml.xml文件中读取它们。虽然这里提到的pathconvert工作得很好,这段代码也创建了这些文件,但如果它也读取myxml.xml文件,它也是完美的:( – shruti

0

试试这个:

构建文件:

<project default="createfile2"> 
<target name="createfile1"> 
    <xslt in="myxml.xml" out="text1.txt" style="test1.xslt"> 
     <param name="d" expression="C:\dir1"/> 
    </xslt> 
</target> 

    <target name="createfile2" depends="createfile1"> 
    <xslt in="myxml.xml" out="text2.txt" style="test1.xslt"> 
     <param name="d" expression="C:\dir2"/> 
    </xslt> 
</target> 
</project> 

XSLT转换

<?xml version="1.0" standalone="yes"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:param name="d"/> 
<xsl:output omit-xml-declaration="yes" method="html" indent="no"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="/root/fileset[@dir=$d]"> 
    <xsl:for-each select="include"> 
     <xsl:value-of select="$d"/>\<xsl:value-of select="@name"/> 
<xsl:text> 
</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

输出文件

text1.txt

C:\dir1\abc.txt 
C:\dir1\def.txt 

text2.txt

C:\dir2\abc2.txt 
C:\dir2\def2.txt 
+0

嗨,Suresh,谢谢你的解决方案,我有2个问题)我还在两个文本文件中的想要的行之前打印了一些不需要的标记值。这些不需要的标记值出现在模板匹配表达式之前的myxml.xml中。 2)是否有替代方案不在build.xml中引用目录名称(expression =“C:\ dir2”)? – shruti

+0

好的问题1)我上面提到的问题已经通过在上面的解决方案中提到的标签之后添加来解决。但问题2仍然存在...... – shruti

+0

您可以在xslt文件本身完成硬编码。我试图避免使用目录名称硬编码的两个xslt文件。 – randominstanceOfLivingThing