2009-05-06 6 views
3

Existe-t-il une API Ant pour lire et extraire des fichiers .xml et en extraire des éléments? Plus précisément, je veux être en mesure de récupérer les valeurs dans un élément de chemin et être capable de marcher tous les éléments dans le chemin.Comment analyser et interpréter le fichier build.xml de la fourmi

Mon but est de récupérer un chemin donné et veiller à ce qu'il soit correctement référencé dans un manifeste, de sorte que la construction et le match manifeste lorsque le produit va à la production.

EDIT: En ce qui concerne les réponses (et merci pour eux) d'utiliser une API XML, le problème est que le fichier de construction en cours de construction est plus complexe que cela. À savoir, le chemin de classe référence un chemin de classe différent et l'inclut, et les éléments référencés dans le chemin de classe sont eux-mêmes définis dans un fichier de propriétés, il y a donc trop d'API Ant à recréer de manière raisonnable.

Répondre

7

Vous pouvez utiliser la classe ProjectHelper pour configurer votre projet avec un fichier de construction. Si le chemin que vous voulez vérifier est contenu dans une référence, vous pouvez simplement obtenir la référence du projet par son ID.

Par exemple, si vous avez quelque chose comme ça dans votre build.xml:

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

Ensuite, vous pouvez obtenir la référence Path avec le code suivant:

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"); 
    } 
} 

Notez que ProjectHelper.configureProject est dépréciée en fourmi 1.6.2, mais pas dans 1.7.

+0

Très cool, merci! – Yishai

2

Je ne pense pas qu'il y ait une API disponible, mais comme vous ne souhaitez que un élément spécifique, vous pouvez simplement écrire un script qui tire uniquement sur l'élément de chemin et les contrôles sur. Un analyseur SAX en python devrait être assez facile à faire avec.

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") 

Ceci permet de lire les nœuds de texte situés entre deux éléments XML. Il devrait être assez facile à personnaliser pour répondre à d'autres exigences simples d'analyse XML.

0

Si vous voulez seulement récupérer un élément spécial, utilisez l'API XML Java.

3

quelque temps nous avons besoin d'analyser le fichier xml dans le script Ant pour exécuter le fichier java ou lire une valeur de la propriété et plus comme celui-ci. Il est très facile, nous pouvons le faire avec l'étiquette appelée <xmlproperty>. Cette balise charge le fichier xml et convertit toutes les valeurs du fichier xml dans la valeur de la propriété ant en interne et nous pouvons utiliser cette valeur comme propriété ant. Par exemple

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

est à peu près équivalent à ce fichier de script en fourmi: <property name="root.properties.foo" value="bar"/> et vous pouvez imprimer cette valeur avec $ {} root.properties.foo.

Exemple complet: 1. Créez un fichier xml Info.xml dire 2. Créez un script ant dire 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> 

Check.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> 

maintenant courir après (Check.xml) script ant, vous obtiendrez la sortie

Buildfile: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml INIT: [echo] Student nom :: Binod Kumar Suman [echo] :: Rouleau 110 [écho] Ville :: Bangalore BUILD RÉUSSI temps total: 125 millisecondes

Il était très simple jusqu'à ici, mais si vous avez plusieurs enregistrements en xml (StudentsInfo.xml) en il affichera tous les enregistrements avec cette séparées par des virgules comme

Buildfile: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml INIT: [echo] Nom de l'étudiant :: Binod Kumar Suman, Pramod Modi, Manish Kumar [echo] :: Rouleau 110120130 [écho] Ville :: Bangalore, Japon, Patna BUILD RÉUSSI temps total: 109 millisecondes

Link

Questions connexes