Как разобрать и интерпретировать муравьиный build.xml - PullRequest
3 голосов
/ 06 мая 2009

Существует ли Ant API для чтения и сборки файла build.xml и извлечения из него элементов? В частности, я хочу иметь возможность получать значения в элементе пути и иметь возможность обходить все элементы в пути.

Моя цель - получить заданный путь и убедиться, что на него правильно ссылаются в манифесте, чтобы сборка и манифест совпадали, когда продукт поступит в производство.

РЕДАКТИРОВАТЬ: Что касается ответов (и спасибо за них) для использования XML API, проблема в том, что файл сборки в том виде, в котором он создан в данный момент, более сложен, чем этот. А именно, classpath ссылается на другой classpath и включает его, а элементы, на которые есть ссылки в classpath, сами определены в файле свойств, поэтому в API Ant слишком много места для разумного воссоздания.

Ответы [ 4 ]

7 голосов
/ 07 мая 2009

Вы можете использовать класс ProjectHelper для настройки вашего проекта с помощью файла сборки. Если путь, который вы хотите проверить, содержится в ссылке, то вы можете просто получить ссылку из проекта по его идентификатору.

Например, если у вас есть что-то подобное в вашем build.xml:

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

Тогда вы можете получить ссылку Path со следующим кодом:

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

Обратите внимание, что ProjectHelper.configureProject устарело в муравье 1.6.2, но не в 1.7.

3 голосов
/ 21 июня 2009

Некоторое время нам нужно проанализировать xml-файл в скрипте Ant, чтобы запустить java-файл или прочитать какое-либо значение свойства и многое другое, например. Это очень просто, мы можем сделать это с помощью тега <xmlproperty>. Этот тег загружает XML-файл и преобразует все значения XML-файла в значение свойства ant для внутреннего использования, и мы можем использовать это значение в качестве свойства ant. Например

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

примерно эквивалентно этому в файле сценария муравья как: <property name="root.properties.foo" value="bar"/> и вы можете напечатать это значение с помощью $ {root.properties.foo}.

Полный пример: 1. Создайте один XML-файл, скажем, Info.xml. 2. Создайте один скрипт ant, скажем, 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>

Теперь после запуска этого (Check.xml) муравейного скрипта вы получите вывод

Файл сборки: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml в этом: [эхо] Имя студента :: Бинод Кумар Суман [эхо] Ролл :: 110 [эхо] Город :: Бангалор СТРОИТЬ УСПЕШНО Общее время: 125 миллисекунд

Здесь все было очень просто, но если у вас есть несколько записей в формате xml (StudentsInfo.xml), тогда все записи будут разделяться запятой, как это

Файл сборки: C: \ XML_ANT_Workspace \ XML_ANT \ src \ Check.xml в этом: [echo] Имя студента :: Бинод Кумар Суман, Прамод Моди, Маниш Кумар [эхо] Roll :: 110,120,130 [эхо] Город :: Бангалор, Япония, Патна СТРОИТЬ УСПЕШНО Общее время: 109 миллисекунд

Ссылка

2 голосов
/ 06 мая 2009

Я не думаю, что есть доступный API, но так как вас интересует только один конкретный элемент, вы можете просто написать скрипт, который только извлекает элемент path и проверяет их. С парсером SAX в python это сделать довольно легко.

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

Это будет читать любые текстовые узлы, которые находятся между двумя элементами XML. Его должно быть довольно легко настроить для выполнения других простых требований синтаксического анализа XML.

0 голосов
/ 06 мая 2009

Если вы хотите получить только специальный элемент, используйте API Java XML.

...