Home Статьи Java Java. Łatwe przetważanie dokumentów XML za pomocą Groovy

Java. Łatwe przetważanie dokumentów XML za pomocą Groovy

Java. Łatwe przetważanie dokumentów XML za pomocą Groovy

There are no translations available.

Zaryzykuję stwierdzenia że tworzenie oraz przetwarzanie dokumentów XML w Java jest banalne. Oczywiście jeżeli stosujemy do tego odpowiednie narzędzia. Zrobię to w trochę nietypowy sposób - zamiast szukać kolejnej biblioteki w języku Java, wyjdę po za ramy tego języka oraz pokaże, jak można tworzyć oraz przetwarzać dokumenty XML w projekcie Java, korzystając z udogodnień, które niesie ze sobą język Groovy. Nadal pozostaniemy przy języku Java, ale dla tworzenia oraz parsowania dokumentów XML będziemy z poziomu kodu Java wywoływać kod Groovy.

Nowy projekt tworzymy za pomocą polecenia:

mvn archetype:generate -DarchetypeGroupId=org.codehaus.gmaven.archetypes -DarchetypeArtifactId=gmaven-archetype-basic -DarchetypeVersion=1.4

Podajemy wszystkie niezbędne parametry:

….
Define value for property 'groupId': : eu.vitaliy
Define value for property 'artifactId': : groovy-java-xml-demo       
Define value for property 'version':  1.0-SNAPSHOT: : 
Define value for property 'package':  eu.vitaliy: : 
[INFO] Using property: name = Example Project
Confirm properties configuration:
groupId: eu.vitaliy
artifactId: groovy-java-xml-demo
version: 1.0-SNAPSHOT
package: eu.vitaliy
name: Example Project
 Y: : Y
…..

Będziemy serializować listę klas POJO:

package eu.vitaliy.groovyxml;
public class Pojo {

    private String name;
    private String type;
    private int quantity;

    public Pojo(String name, String type, int quantity) {
        this.name = name;
        this.type = type;
        this.quantity = quantity;
    }

    public int getQuantity() {
        return quantity;
    }

    public String getName() {
        return name;
    }

    public String getType() {
        return type;
    }
}

Spróbujemy stworzyć dokument o takiej treści:

<root>
    <item qty="”10”">
           <name>Orange</name>
           <type>Fruit</type>
    </item>
    <item qty="”6”">
           <name>Apple</name>
           <type>Fruit</type>
    </item>
</root>

W katalogu src/main/groovy stworzymy klasę eu.vitaliy.groovyxml.DocumentCreator odpowiedzialną za utworzenie dokumentu xml. Wynikiem wywołania metody createDokument będzie plik test.xml który powstanie w katalogu target:

package eu.vitaliy.groovyxml

import groovy.xml.MarkupBuilder

class DocumentCreator {

    private String fileName

    static DocumentCreator newInstance(String filename) {
        return new DocumentCreator(fileName: filename)
    }


    void createDokument(Pojo ... fruits) {
        def file = new File(fileName)

        def markupBuilder = new MarkupBuilder(new FileWriter(file))

        markupBuilder.root {
            fruits.each { o ->
                item(qty: o.quantity) {
                    name(o.name)
                    type(o.type)
                }
            }
        }
    }
}

Nasuwa się pytanie, jak to jest możliwe, że obiekt markupBuilder wywołuje nie istniejącą metodę root która jako parametr przyjmuje domknięcie w ciele którego są wywoływane nie istniejące metody item, name oraz type? Właśnie w tym kryje się cała magia Groovy, można w to nie wnikać, ale jest to możliwe dzięki wsparciu MOP (metaobject protocol http://en.wikipedia.org/wiki/Metaobject#Metaobject_protocol) na poziomie języka Groovy. Metoda newInstance(String) jest odpowiednikiem konstruktora, stworzyłem ją dla tego, że nie odkryłem w jaki sposób z poziomu Java można wywoływać konstruktory Groovy z wieloma argumentami ustawiającymi pola klasy.

Za przetwarzanie dokumentu będzie odpowiedzialna klasa eu.vitaliy.groovyxml.DocumentReader :

package eu.vitaliy.groovyxml

class DocumentReader {

    private String fileName


    static DocumentReader newInstance(String fileName){
          return new DocumentReader(fileName: fileName)
    }

    void read(){
        def xml = new XmlSlurper().parse(fileName)
        xml.item.each { item ->
            println "${item.name},  ${item.@qty}, ${item.type}"
        }

    }
}

I wreście, metoda main() :

 
package eu.vitaliy.groovyxml;

public class Main {

    public static void main(String[] args){

        String fileName = "target/test.xml";

        //Create document
        DocumentCreator documentCreator = DocumentCreator.newInstance(fileName);
        documentCreator.createDokument(
                        new Pojo("Orange", "Fruit", 10),
                        new Pojo("Apple", "Fruit", 6 )
        );

        //Read document
        DocumentReader documentReader = DocumentReader.newInstance(fileName);
        documentReader.read();
    }
}

Warto zauważyć, że kod Groovy jest wywoływany z poziomy Java a kod Java jest wywoływany z poziomu Groovy. Jest to możliwe dzięki gmaven-plugin.  Myślę że nigdy nie widzieliście bardziej zwięzłego kodu przetwarzania XML w Java niż ten, który stworzyliśmy. Przykład jest dostępny, na github: https://github.com/VitaliyOliynyk/groovyxml


Комментарии  

 
0 # Williamelats 20.11.2017 15:51
Quickly lose weight - it's easy:
https://sites.google.com/site/weightlossluxury/weight-loss-tips-weight-loss-exercise-loosing-belly-fat-diet-plans


Popular tags:
weight loss dallas buyers club jared leto
weight loss night sweats abdominal pain
12wbt weight loss blog
buy semtex extreme weight loss
meal portion size weight loss
locations of fat camps or weight loss camps
my fit foods 21 day challenge weight loss
fluidity detox weight loss system
free food plan to lose weight
Ответить | Ответить с цитатой | Цитировать
 

Добавить комментарий


Защитный код
Обновить