Wie zu analysieren und build.xml Ameise zu interpretieren
Frage
Gibt es einen Ant-API zum Lesen und ant build.xml und Abrufen von Elementen aus oder? Insbesondere möchte ich in der Lage sein, die Werte in einem Pfad Element abzurufen und in der Lage sein, alle Elemente auf dem Weg zu gehen.
ist mein Ziel um einen bestimmten Pfad zu holen und sicherzustellen, dass sie korrekt in einem offensichtlichen Bezug genommen wird, so dass der Aufbau und das Manifest Spiel, wenn das Produkt auf der Produktion geht.
EDIT: die Antworten Bezug auf (und danken Ihnen für sie) eine XML-API zu verwenden, ist das Problem, dass die Build-Datei, wie sie derzeit als das ist komplexer aufgebaut. Nämlich der Classpath verweist auf eine andere Classpath und schließt sie und die Elemente in dem Classpath verwiesen werden selbst definiert in einer Eigenschaftendatei, so dass es zu viel von dem Ant-API maßt neu.
Lösung
Sie können die ProjectHelper
-Klasse verwenden, Ihr Projekt mit einem Buildfile zu konfigurieren. Wenn der Pfad, den Sie überprüfen wollen, in einem Referenz enthalten sind, dann können Sie nur die Referenz erhalten aus dem Projekt durch seine ID.
Zum Beispiel, wenn Sie so etwas wie diese haben in Ihrem build.xml
:
<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 1.6.2 veraltet, aber nicht in 1.7.
Andere Tipps
Einige Zeit, die wir brauchen XML-Datei in Ant-Skript zu analysieren, um die Java-Datei ausführen oder eine Eigenschaft Wert und mehr wie diese lesen.
Es ist sehr einfach, können wir dies mit dem Tag genannt <xmlproperty>
tun. Dieser Tag lädt die XML-Datei und es alle Werte von XML-Datei in ant Eigenschaftswert umwandeln intern 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 $ drucken {root.properties.foo}.
vollständige 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>
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>
Jetzt, nach diesem (Check.xml) Ant-Skript ausführen, werden Sie Ausgabe erhalten
Buildfile: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml drin: [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 (StudentsInfo.xml) haben, dann wird es alle Datensätze zeigen mit Komma wie folgt getrennt
Buildfile: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml drin: [Echo] Schülername :: Binod Kumar Suman, Pramod Modi, Manish Kumar [Echo] Rollen :: 110120130 [Echo] Stadt :: Bangalore, Japan, Patna BUILD ERFOLGREICH Gesamtzeit: 109 Millisekunden
Das glaube ich nicht, dass es eine API zur Verfügung, aber wie Sie in einem bestimmten Elemente nur daran interessiert sind, können Sie nur ein Skript schreiben, das sich nur den Pfad Element zieht und prüft über. Ein SAX-Parser in Python sollte ziemlich einfach sein, dies zu tun mit.
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 alle Textknoten lesen, die zwischen zwei XML-Elemente sind. Es sollte ziemlich einfach sein anpassen andere einfache XML-Parsing Anforderungen zu erfüllen.
Wenn Sie nur ein spezielles Element abrufen möchten, verwenden Sie die Java XML-API.