سؤال

هل هناك واجهة برمجة تطبيقات للنمل للقراءة والبناء 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top