1

以下の構造体を含むXmlファイルがあります。ノードごとにうなずきを読み取り、commom セパレーターなしで値を指定して特定のタスクを呼び出したいのですが、Ant ではこれは可能ですか?

<projects>
<!-- first node -->
 <project>
    <name> </name>
    <url> </url>
    <package> </package>
 </project>

 <!-- Second node -->
 <project>
    <name> </name>
    <url> </url>
    <package> </package>
 </project>
<projects>

ありがとう!

4

3 に答える 3

1

XSLTタスクを使用して、入力XMLファイルを処理してANTスクリプトにし、その後実行します。

|-- build.xml
|-- projects-process.xsl
`-- projects.xml

実行すると、の情報が処理されます

$ ant
Buildfile: /home/mark/tmp/build.xml

run-projects:
     [xslt] Processing /home/mark/tmp/projects.xml to /home/mark/tmp/build-tmp.xml
     [xslt] Loading stylesheet /home/mark/tmp/projects-process.xsl

build:

dosomething:
     [echo] DOSOMETHING: 'Project 1' 'http://someurl1' 'project1'"

dosomething:
     [echo] DOSOMETHING: 'Project 2' 'http://someurl2' 'project2'"

BUILD SUCCESSFUL

projects.xml

<projects>

    <project>
        <name>Project 1</name>
        <url>http://someurl1</url>
        <package>project1</package>
    </project>

    <project>
        <name>Project 2</name>
        <url>http://someurl2</url>
        <package>project2</package>
    </project>

</projects>

projects-process.xsl

このXSLTスタイルシートは、ANTスクリプトを生成するために使用されます

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <project name="genbuild" default="build">

            <target name="build">
                <xsl:apply-templates select="projects/project"/>
            </target>

            <target name="dosomething">
                <echo>DOSOMETHING: '${name}' '${url}' '${package}'"</echo>
            </target>

        </project>
    </xsl:template>

    <xsl:template match="project">
        <antcall target="dosomething">
            <param name="name"    value="{name}"/>
            <param name="url"     value="{url}"/>
            <param name="package" value="{package}"/>
        </antcall>
    </xsl:template>

</xsl:stylesheet>

build.xml

XSLT変換を実行して、projects.xmlファイルを処理し、ANTビルドファイルを生成します

<project name="demo" default="run-projects">

    <target name="run-projects">
        <xslt style="projects-process.xsl" in="projects.xml" out="build-tmp.xml"/>

        <ant antfile="build-tmp.xml"/>
    </target>

    <target name="clean">
        <delete file="build-tmp.xml"/>
    </target>

</project>
于 2012-07-17T19:50:05.180 に答える
0

Antプロジェクトを同じAntビルドファイル内にネストすることはできません。ただし、ビルドロジックはMacroDefsを使用してモジュール化できます。さらに、サブプロジェクトは独自のビルドファイルを持つことができ、AntAntタスクを使用してマスタービルドファイルから呼び出すことができます。Antターゲットは、AntCallタスクを使用して同じビルドファイル内で呼び出すことができます。

于 2012-07-17T18:45:54.817 に答える
0

チアゴルシルバ、

xmlproperty と javascript の組み合わせを使用して、projects.xml ファイルの複数要素 (同じノード) を分割し、ant でプロジェクト ノード データ フィールドを使用することができました。すべてのアクションは、1 回の実行で 1 つの ant ファイルで実行されます。

上記の例のサンプル データ projects.xml ファイル:

<projects>
    <project>
        <name>Project 1</name>
        <url>//someurl1</url>
        <package>project1</package>
    </project>
    <project>
        <name>Project 2</name>
        <url>//someurl2</url>
        <package>project2</package>
    </project>
</projects>

次の形式の projects.xml ファイルに変換する必要があります。

<myProjects>
    <!-- name;url;package -->
    <myProject>Project 1;//someurl1;project1</myProject>
    <myProject>Project 2;//someurl2;project2</myProject>
</myProjects>

ここで、前のノード要素は、フィールドが「;」で区切られた単一の文字列に変換されました。キャラクター。

JavaScript で ant の「プロジェクト」オブジェクトを使用するため、混乱を避けるために要素「プロジェクト」の名前を「myProject」に変更しました。

反復可能な xml ノードを文字列にフラット化したら、次の ant スクリプトを使用して要素を反復処理し、フラット化されたプロパティを読み取り、必要に応じて使用できます。

<project name="testProjects" default="ProcessProjects" basedir=".">

  <target name="init" >
  <!-- From: http://sourceforge.net/projects/ant-contrib/files/ant-contrib/ 
     download the jar and put it a created "lib" folder of your project, where ant file is.
  -->
    <taskdef resource="net/sf/antcontrib/antlib.xml">
      <classpath><pathelement location="./lib/ant-contrib-1.0b3.jar"/></classpath>
    </taskdef>
    <xmlproperty file="./projects.xml" keepRoot="false"/>

    <!-- Properties will be used to store the values of: name;url;package -->
    <property name="name" value=""/>
    <property name="url" value=""/>
    <property name="package" value=""/>
  </target>

  <target name="ProcessProjects" depends="init">
    <echo>Process Projects</echo>
    <foreach list="${myProject}" target="processLoopStep" param="var1"/>
  </target>

  <target name="processLoopStep" >
    <script language="javascript"> <![CDATA[
      var var1 = project.getProperty("var1");
      var parts = var1.split(";");
      project.setProperty("name",parts[0]);
      project.setProperty("url",parts[1]);
      project.setProperty("package",parts[2]);
      ]]>
    </script>

    <!-- Do what you like with the values of the <project> element -->
    <echo message="myProject name = ${name} url = ${url} package = ${package}"/>
  </target>

</project>

ファイル: - C:\temp\lib\ProcessProjects.xml - ビルド - C:\temp\lib\projects.xml - データ - C:\temp\lib\ant-contrib-1.0b3.jar - lib jar

出力:

C:\temp>ant -f ProcessProjects.xml

Buildfile: C:\temp\ProcessProjects.xml
init:
ProcessProjects:
     [echo] Process Projects
processLoopStep:
     [echo] myProject name = Project 1 url = //someurl1 package = project1
processLoopStep:
     [echo] myProject name = Project 2 url = //someurl2 package = project2
BUILD SUCCESSFUL
Total time: 0 seconds

よろしく、ジュレク

于 2013-06-19T22:42:56.233 に答える