2009-05-06 8 views
3

Gibt es eine Ant-API zum Lesen und zur Ant build.xml und zum Abrufen von Elementen daraus? Insbesondere möchte ich in der Lage sein, die Werte in einem Pfadelement abzurufen und in der Lage zu sein, alle Elemente in dem Pfad zu durchlaufen.Wie analysiere und interpretiere ich die Datei build.xml von ant

Mein Zweck besteht darin, einen bestimmten Pfad abzurufen und sicherzustellen, dass in einem Manifest korrekt referenziert wird, damit der Build und das Manifest übereinstimmen, wenn das Produkt in Produktion geht.

EDIT: In Bezug auf die Antworten (und danke für sie), eine XML-API zu verwenden, ist das Problem, dass die Build-Datei als derzeit erstellt komplexer als das ist. Der Klassenpfad verweist nämlich auf einen anderen Klassenpfad und schließt ihn ein, und die im Klassenpfad referenzierten Elemente werden selbst in einer Eigenschaftendatei definiert. Daher gibt es zu viele Ant-APIs, die sinnvollerweise neu erstellt werden können.

Antwort

7

Sie können die Klasse ProjectHelper verwenden, um Ihr Projekt mit einer Builddatei zu konfigurieren. Wenn der zu überprüfende Pfad in einer Referenz enthalten ist, können Sie die Referenz aus dem Projekt einfach mit der ID abrufen.

Zum Beispiel, wenn Sie so etwas wie dies in Ihrem build.xml haben:

<path id="classpath"> 
    <fileset dir="${basedir}/lib" includes="*.jar"/> 
</path> 

Dann können Sie die Path Referenz mit dem folgenden Code erhalten:

import java.io.File; 

import org.apache.tools.ant.Project; 
import org.apache.tools.ant.ProjectHelper; 
import org.apache.tools.ant.types.Path; 

public class Test { 
    public static void main(String[] args) throws Exception {  
     Project project = new Project(); 
     File buildFile = new File("build.xml"); 
     project.init(); 
     ProjectHelper.configureProject(project, buildFile); 

     Path path = (Path) project.getReference("classpath"); 
    } 
} 

Beachten Sie, dass ProjectHelper.configureProject in ant ist veraltet 1.6.2, aber nicht in 1.7.

+0

Sehr cool, danke! – Yishai

2

Ich glaube nicht, dass es eine API gibt, aber da Sie nur an einem bestimmten Element interessiert sind, könnten Sie einfach ein Skript schreiben, das nur das Pfadelement herauszieht und überprüft. Ein SAX-Parser in Python sollte dies relativ einfach machen.

from xml.sax import make_parser 
from xml.sax.handler import ContentHandler 

def PathHandler(ContentHandler): 
    def __init__(self): 
     self._reading_path = False 
     self._path = "" 

    def start_element(self, name, attrs): 
     if name == "path": 
      self._reading_path = True 

    def characters(self, ch): 
     if self._reading_path: 
      self._path += ch 

    def end_element(self, name): 
     if name == "path": 
      self._reading_path = False 
      #self._path is now populated with the contents of the path element 

    @property 
    def path(self): 
     return self._path 

handler = PathHandler() 
parser = make_parser() 
parser.setContentHandler(handler) 
parser.parse("build.xml") 

Dies würde Textknoten lesen, die sich zwischen zwei XML-Elementen befinden. Es sollte relativ einfach angepasst werden können, um andere einfache XML-Analyseanforderungen zu erfüllen.

0

Wenn Sie nur ein spezielles Element abrufen möchten, verwenden Sie die Java XML-API.

3

Einige Zeit müssen wir XML-Datei im Ant-Skript zu analysieren, um die Java-Datei oder lesen Sie einige Eigenschaft Wert und mehr so. Es ist sehr einfach, wir können dies mit dem Tag <xmlproperty> tun. Dieses Tag lädt die XML-Datei und konvertiert intern alle Werte der XML-Datei in den ant-Eigenschaftswert und wir können diesen Wert als ant-Eigenschaft verwenden. Zum Beispiel

<root> 
    <properties> 
     <foo>bar</foo> 
    </properties> 
</root> 

entspricht in etwa diese in Ant-Skript-Datei als: <property name="root.properties.foo" value="bar"/> und Sie können diesen Wert mit $ {root.properties.foo} drucken.

vollständiges Beispiel: 1. Erstellen Sie eine XML-Datei sagen Info.xml 2. Erstellen Sie ein Ant-Skript sagen Check.xml

Info.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Students> 

    <Student> 
    <name>Binod Kumar Suman</name> 
     <roll>110</roll> 
    <city> Bangalore </city> 
    </Student> 


</Students> 

prüfen.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Check" default="init"> 
<xmlproperty file="Info.xml" collapseAttributes="true"/> 

<target name = "init"> 
    <echo> Student Name :: ${Students.Student.name} </echo> 
    <echo> Roll :: ${Students.Student.roll} </echo> 
    <echo> City :: ${Students.Student.city} </echo> 
</target> 

</project> 

Jetzt, nach dieser (Check.xml) Ant-Skript ausführen, werden Sie Ausgabe

Buildfile erhalten: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml init: [echo] Studenten Name :: Binod Kumar Suman [echo] Rollen :: 110 [echo] Stadt :: Bangalore BUILD ERFOLGREICH Gesamtzeit: 125 Millisekunden

Es war sehr einfach bis hier, aber wenn Sie mehrere Datensätze in xml (StudentenInfo.xml) th en es alle Datensätze mit Komma zeigen wie diese getrennt

Buildfile: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml init: [echo] Schülername :: Binod Kumar Suman, Pramod Modi, Manish Kumar [echo] Rollen :: 110.120.130 [echo] Stadt :: Bangalore, Japan, Patna BUILD ERFOLGREICH Gesamtzeit: 109 Millisekunden

Link

Verwandte Themen