web-dev-qa-db-fra.com

comment analyser XML en objet Java?

J'ai un XML qui est utilisé pour configurer certaines règles, il n'a pas de structure complexe, mais cette configuration est utilisée n'importe où dans mon système. Je souhaite donc analyser ce XML en objet Java et le concevoir en mode singleton. pouvez-vous l'utiliser pour dissocier les objets XML en objets Java directement sans écrire beaucoup de codes?

J'ai fait des recherches sur Google et je savais que JAXB était un choix. Mon application est juste un type d’outil permettant de lire les règles puis de suivre les choses. JAXB pourrait être utilisé plus largement comme service Web. 

Si oui, la question la plus importante est que j’ai utilisé xjc pour générer la classe source d’objet Java en fonction du fichier xsd. configuration), je vois que la plupart des codeurs l’ont fait, mais pourquoi? parce qu’il s’agit de données, de l’objet généré à JAXB et copié dans l’objet POJO créé

26
C.c

JAXB est une solution idéale. Mais vous n’avez pas nécessairement besoin de xsd et xjc pour cela. Le plus souvent, vous n'avez pas de fichier xsd mais vous savez ce que votre fichier xml est. Analysez simplement votre XML, par exemple,

<customer id="100">
    <age>29</age>
    <name>mkyong</name>
</customer>

Créez les classes de modèle nécessaires:

@XmlRootElement
public class Customer {

    String name;
    int age;
    int id;

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }

}

Essayez de démêler:

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml"));

Vérifiez les résultats, corrigez les bugs!

57

Une chose qu'il est vraiment important de comprendre compte tenu du fait que vous avez un fichier XML comme: 

<customer id="100">
    <Age>29</Age>
    <NAME>mkyong</NAME>
</customer>

Je suis désolé de vous informer mais:

@XmlElement
public void setAge(int age) {
    this.age = age;
}

ne vous aidera pas, car il essaie de rechercher "age" au lieu du nom de l'élément "Age" à partir du XML.

Je vous encourage à spécifier manuellement le nom de l'élément correspondant à celui du fichier XML:

@XmlElement(name="Age")
public void setAge(int age) {
    this.age = age;
}

Et si vous avez par exemple: 

@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
public class Customer {
...

Cela signifie qu’il utilisera les beans Java par défaut et, à ce stade, si vous indiquez que vous ne devez pas définir 

@XmlElement(name="NAME")

une annotation au-dessus d'une méthode de définition pour un élément <NAME>..</NAME> échouera en indiquant qu'il ne peut pas y avoir deux éléments sur une seule variable.

J'espère que ça aide.

6
aks

Pour exécuter Unmarshall avec JAXB:

1) Convertir un XML donné en XSD (par vous-même ou par un convertisseur en ligne),

2) Créer un projet JAXB dans Eclipse,

3) Créer un fichier XSD et coller ce contenu converti XSD,

4) Faites un clic droit sur ** fichier XSD -> Générer -> Classes JAXB -> suivez les instructions (cela créera tous les fichiers .Java nessasary dans src, c’est-à-dire une information de paquet, une fabrique d’objets et une classe pojo),

5) Créez un autre fichier .Java dans src pour exécuter l’opération unmarshall et exécutez-le.

Bonne codage !!

5
Soumya Sarkar

JAXB est un choix fiable, car il mappe les classes XML à Java de manière fluide. Mais il existe d'autres cadres disponibles, en voici un:

https://code.google.com/p/xmappr/

3
Juned Ahsan

Je trouve que jackson fasterxml est un bon choix pour serializing/deserializing bean avec XML.

Référez-vous: Comment utiliser spring pour marshal et unmarshal xml?

1
bluearrow