كيفية تحليل وتفسير Ant's Build.xml
سؤال
هل هناك واجهة برمجة تطبيقات للنمل للقراءة والبناء ant.xml واسترداد العناصر منه؟ على وجه التحديد ، أريد أن أكون قادرًا على استرداد القيم في عنصر المسار وأن أكون قادرًا على السير في جميع العناصر في المسار.
غرضي هو استرداد مسار معين والتأكد من أنه يتم الرجوع إليه بشكل صحيح في بيان ، بحيث يتطابق البناء والبيان عندما يخرج المنتج إلى الإنتاج.
تحرير: فيما يتعلق بالردود (وشكرا لك) لاستخدام واجهة برمجة تطبيقات XML ، فإن المشكلة هي أن ملف الإنشاء كما تم إنشاؤه حاليًا أكثر تعقيدًا من ذلك. وهي ClassPath تشير إلى classpath مختلفة وتتضمن ذلك والعناصر المشار إليها في classpath محددة نفسها في ملف الخصائص ، لذلك هناك الكثير من ANT API لإعادة إنشائها بشكل معقول.
المحلول
يمكنك استخدام ال ProjectHelper
فئة لتكوين مشروعك مع buildfile. إذا كان المسار الذي تريد التحقق منه موجودًا في مرجع ، فيمكنك فقط الحصول على المرجع من المشروع حسب معرفه.
على سبيل المثال ، إذا كان لديك شيء مثل هذا في 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
تم إهماله في ANT 1.6.2 ، ولكن ليس في 1.7.
نصائح أخرى
في بعض الأحيان نحتاج إلى تحليل ملف XML في برنامج ANT Script لتشغيل ملف 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>
الآن بعد تشغيل هذا البرنامج النصي ANT (check.xml) ، سوف تحصل على الإخراج
BuildFile: C: xml_ant_workspace xml_ant src check.xml init: [echo] اسم الطالب :: binod kumar suman [echo] Roll :: 110 [Echo] City :: Bangalore Build Total Total: 125 millisecondss
كان الأمر بسيطًا جدًا هنا ، ولكن إذا كان لديك سجلات متعددة في XML (studentInfo.xml) ، فسيظهر كل السجلات مع فاصلة مفصولة مثل هذا
BuildFile: C: xml_ant_workspace xml_ant src check.xml init: [echo] اسم الطالب :: binod kumar suman ، pramod modi ، manish kumar [echo] roll :: 110،120،130 بناء إجمالي الوقت الناجح: 109 ميلي ثانية
لا أعتقد أن هناك واجهة برمجة تطبيقات متاحة ، ولكن بما أنك مهتم فقط بعنصر معين ، يمكنك فقط كتابة برنامج نصي يسحب فقط عنصر المسار ويتحقق منه. يجب أن يكون محلل ساكس في بيثون سهلًا إلى حد ما.
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 البسيطة الأخرى.
إذا كنت ترغب فقط في استرداد عنصر خاص ، فاستخدم Java XML API.