53 votes

Quelle est la meilleure façon / la plus simple de lire dans un fichier XML dans une application Java?

Actuellement, notre application Java utilise les valeurs contenues dans un fichier * .cfg délimité par des tabulations. Nous devons changer cette application pour qu'elle utilise désormais un fichier XML.

Quelle est la bibliothèque la meilleure / la plus simple à utiliser pour lire les valeurs de ce fichier?

54voto

Guillaume Points 8549

Il existe bien sûr de nombreuses bonnes solutions en fonction de vos besoins. S'il ne s'agit que de configuration, vous devriez jeter un œil à Jakarta commons-configuration et commons-digester .

Vous pouvez toujours utiliser la méthode JDK standard pour obtenir un document:

 import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

[...]

File file = new File("some/path");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(file);
 

36voto

ran Points 269
<?xml version="1.0"?>
<company>
    <staff id="1001">
        <firstname>yong</firstname>
        <lastname>mook kim</lastname>
        <nickname>mkyong</nickname>
        <salary>100000</salary>
    </staff>
    <staff id="2001">
        <firstname>low</firstname>
        <lastname>yin fong</lastname>
        <nickname>fong fong</nickname>
        <salary>200000</salary>
    </staff>
</company>



import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class ReadXMLFile {

  public static void main(String argv[]) {

    try {

    File fXmlFile = new File("/Users/mkyong/staff.xml");
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(fXmlFile);

    //optional, but recommended
    //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
    doc.getDocumentElement().normalize();

    System.out.println("Root element :" + doc.getDocumentElement().getNodeName());

    NodeList nList = doc.getElementsByTagName("staff");

    System.out.println("----------------------------");

    for (int temp = 0; temp < nList.getLength(); temp++) {

        Node nNode = nList.item(temp);

        System.out.println("\nCurrent Element :" + nNode.getNodeName());

        if (nNode.getNodeType() == Node.ELEMENT_NODE) {

            Element eElement = (Element) nNode;

            System.out.println("Staff id : " + eElement.getAttribute("id"));
            System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent());
            System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent());
            System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent());
            System.out.println("Salary : " + eElement.getElementsByTagName("salary").item(0).getTextContent());

        }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
  }

}


----------------

Root element :company
----------------------------

Current Element :staff
Staff id : 1001
First Name : yong
Last Name : mook kim
Nick Name : mkyong
Salary : 100000

Current Element :staff
Staff id : 2001
First Name : low
Last Name : yin fong
Nick Name : fong fong
Salary : 200000

10voto

James Van Huis Points 3333

Est-il une raison particulière pour laquelle vous avez choisi XML fichiers de configuration? J'ai fait XML configs dans le passé, et ils ont souvent plus de mal à la tête qu'autre chose.

Je suppose que la vraie question est de savoir si en utilisant quelque chose comme les Préférences de l'API qui pourrait fonctionner mieux dans votre situation.

Raisons d'utiliser les Préférences de l'API sur un rouleau de-votre-propre XML solution:

  • Évite typique XML laideur (DocumentFactory, etc), ainsi que d'éviter 3ème partie les bibliothèques de fournir le XML backend

  • Un support intégré pour les valeurs par défaut (pas de manipulation spéciale nécessaire pour manquant/endommagé/entrées invalides)

  • Pas besoin de désinfecter les valeurs pour le stockage XML (CDATA emballage, etc)

  • La garantie d'état de la mémoire de sauvegarde (pas besoin de constamment écrire du XML sur le disque)

  • Magasin de sauvegarde est configurable (fichier sur le disque, LDAP, etc.)

  • Multi-thread accès à toutes les préférences gratuit

9voto

Jonik Points 18905

Quel est le meilleur/la plus simple à la bibliothèque utiliser pour lire des valeurs d' ce fichier?

Comme vous demandons la plus simple de la bibliothèque, je me sens obligé d'ajouter une approche assez différente de celle de Guillaume de haut voté réponse. (D'autres réponses, sjbotha de JDOM mention est le plus proche de ce que je propose).

J'en suis venu à penser que pour la gestion XML en Java, en utilisant le standard de JDK outils n'est certainement pas la façon la plus simple, et que c'est seulement dans certaines circonstances (par exemple ne pas être en mesure d'utiliser la 3ème partie des bibliothèques, pour une certaine raison) c'est le meilleur moyen.

Au lieu de cela, pensez à utiliser une bonne bibliothèque XML, tels que XOM. Voici comment lire un fichier XML dans un nu.xom.Document objet:

import nu.xom.Builder;
import nu.xom.Document;
import java.io.File;

[...]

File file = new File("some/path");
Document document = new Builder().build(file);

Alors, c'était juste un peu plus simple, car la lecture du fichier en org.w3c.dom.Document n'était pas très compliqué non plus, dans la "pure JDK" approche. Mais les avantages de l'utilisation d'une bonne bibliothèque ne démarre ici! Quoi que vous fassiez avec votre XML, vous aurez souvent à l'écart avec beaucoup de solutions plus simples et les moins de votre propre code à maintenir, lors de l'utilisation d'une bibliothèque comme XOM. À titre d'exemples, considérer cette contre cette, ou cette contre cette, ou ce post contenant à la fois XOM et DOM du W3C exemples.

D'autres vont fournir des contre-arguments (comme ces) pourquoi coller à la Java standard XML Api peut-être vaut - sans doute ont le mérite, au moins dans certains cas, bien que personnellement, je ne souscris pas à tous. Dans tous les cas, lors du choix d'une manière ou l'autre, il est bon d'être conscient des deux côtés de l'histoire.

(Cette réponse est une partie de mon évaluation de XOM, qui est un concurrent sérieux dans ma quête pour trouver le meilleur Java XML bibliothèque pour remplacer dom4j.)

6voto

Markus Lausberg Points 6944

Voici un exemple de code pour lire un fichier XML

Lire le fichier XML

Un moyen simple de lire / écrire / modifier des fichiers XML est d'utiliser XStream. XStream peut convertir des objets Java en fichier XML.

Site Web XStream

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X