Разбор файла конфигурации Ant и XML - PullRequest
4 голосов
/ 10 августа 2009

У меня есть XML-файл следующей формы -

<map MAP_XML_VERSION="1.0">
    <entry key="database.user" value="user1"/>
    ...
</map>

Есть ли у ant встроенная возможность прочитать это и позволить мне выполнить xquery для получения значений ключей? Проходя через API я таких возможностей не видел.

Ответы [ 3 ]

10 голосов
/ 10 августа 2009

Необязательная задача Ant XMLTask предназначена для этого. Присвойте ему выражение XPath, и вы можете выделить вышеупомянутое в (скажем) свойство. Вот статья о том, как ее использовать, с примерами. Он также будет выполнять множество других манипуляций / запросов / создания, связанных с XML.

, например

<xmltask source="map.xml">
   <!-- copies to a property 'user' -->
   <copy path="/map/entry[@key='database.user']/@value" attrValue="true" property="user"/>
</xmltask>

Отказ от ответственности: я автор.

8 голосов
/ 10 августа 2009

Вы можете использовать тег scriptdef , чтобы создать оболочку JavaScript для вашего класса. Внутри JS вы в значительной степени обладаете всей мощью Java и можете выполнять любой сложный анализ XML, какой захотите.

Например:

<project default="build">        
    <target name="build">            
        <xpath-query query="//entry[@key='database.user']/@value"
                     xmlFile="test.xml" addproperty="value"/>
        <echo message="Value is ${value}"/>    
    </target>

    <scriptdef name="xpath-query" language="javascript">
        <attribute name="query"/>
        <attribute name="xmlfile"/>
        <attribute name="addproperty"/>

        <![CDATA[
            importClass(java.io.FileInputStream);
            importClass(javax.xml.xpath.XPath);
            importClass(javax.xml.xpath.XPathConstants);
            importClass(javax.xml.xpath.XPathFactory);
            importClass(org.xml.sax.InputSource);

            var exp = attributes.get("query");
            var filename = attributes.get("xmlfile");
            var input = new InputSource(new FileInputStream(filename));
            var xpath = XPathFactory.newInstance().newXPath();
            var value = xpath.evaluate(exp, input, XPathConstants.STRING);

            self.project.setProperty( attributes.get("addproperty"), value );

        ]]>

    </scriptdef>
</project>
0 голосов
/ 10 августа 2009

Звучит так, будто вы хотите что-то вроде ant-xpath-task . Я не знаю встроенного способа сделать это с помощью Ant.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...