web-dev-qa-db-fra.com

Comment récupérer la valeur d'élément de XML en utilisant Java?

Je suis nouveau sur XML. Je veux lire le code XML suivant sur la base du nom de la demande. Aidez-moi à lire le code XML ci-dessous dans Java -

<?xml version="1.0"?>
    <config>
        <Request name="ValidateEmailRequest">
            <requestqueue>emailrequest</requestqueue>
            <responsequeue>emailresponse</responsequeue>
        </Request>
        <Request name="CleanEmail">
            <requestqueue>Cleanrequest</requestqueue>
            <responsequeue>Cleanresponse</responsequeue>
        </Request>
    </config>
44
Sameek Mishra

Si votre XML est une chaîne, vous pouvez alors:

String xml = ""; //Populated XML String....

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
Element rootElement = document.getDocumentElement();

Si votre XML est dans un fichier, alors Document document Sera instancié comme ceci:

Document document = builder.parse(new File("file.xml"));

La document.getDocumentElement() vous renvoie le noeud qui est l'élément document du document (dans votre cas <config>).

Une fois que vous avez un rootElement, vous pouvez accéder à l'attribut de l'élément (en appelant la méthode rootElement.getAttribute()), etc. Pour plus de méthodes sur Java org.w3c.dom.Element =

Plus d'infos sur Java DocumentBuilder & DocumentBuilderFactory . Gardez à l'esprit , l'exemple fourni crée un arbre DOM XML. Ainsi, si vous avez une énorme donnée XML, cet arbre peut être énorme.


Update Voici un exemple pour obtenir la "valeur" de l'élément <requestqueue>

protected String getString(String tagName, Element element) {
        NodeList list = element.getElementsByTagName(tagName);
        if (list != null && list.getLength() > 0) {
            NodeList subList = list.item(0).getChildNodes();

            if (subList != null && subList.getLength() > 0) {
                return subList.item(0).getNodeValue();
            }
        }

        return null;
    }

Vous pouvez effectivement l'appeler comme,

String requestQueueName = getString("requestqueue", element);
62
Buhake Sindi

Si vous souhaitez simplement obtenir une valeur unique à partir du XML, vous pouvez utiliser la bibliothèque XPath de Java. Pour un exemple, voir ma réponse à une question précédente:

Cela ressemblerait à quelque chose comme:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document dDoc = builder.parse("E:/test.xml");

            XPath xPath = XPathFactory.newInstance().newXPath();
            Node node = (Node) xPath.evaluate("/Request/@name", dDoc, XPathConstants.NODE);
            System.out.println(node.getNodeValue());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
25
bdoughan

Au cas où vous auriez simplement besoin d’une (première) valeur à récupérer à partir de xml:

public static String getTagValue(String xml, String tagName){
    return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0];
}

Si vous souhaitez analyser un document XML complet, utilisez JSoup:

Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
for (Element e : doc.select("Request")) {
    System.out.println(e);
}
22
yurin

Il y a différentes façons de le faire. Vous pourriez vouloir vérifier XStream ou [~ # ~] jaxb [~ ​​# ~] . Il y a des tutoriels et des exemples.

4
posdef

Il y a deux façons générales de le faire. Vous allez soit créer un modèle d'objet de domaine à partir de ce fichier XML, jetez un oeil à this

et le deuxième choix consiste à utiliser l'analyse par événement, qui constitue une alternative à la représentation DOM xml. À mon humble avis, vous pouvez trouver la meilleure comparaison globale de ces deux techniques de base ici . Bien sûr, il y a beaucoup plus à savoir sur le traitement xml, par exemple, si vous recevez une définition de schéma XML (XSD), vous pouvez utiliser [~ # ~] jaxb [~ ​​# ~] .

1
lisak

Puisque vous utilisez ceci pour la configuration, votre meilleur choix est Apache commons-configuration . Pour les fichiers simples, il est beaucoup plus facile à utiliser que les analyseurs XML "bruts".

Voir le XML comment faire

0
Bozho

Vous pouvez créer une classe qui étend org.xml.sax.helpers.DefaultHandler et appeler

start_<tag_name>(Attributes attrs);

et

end_<tag_name>();

Car c'est:

start_request_queue(attrs);

etc.

Et puis étend cette classe et implémenter les analyseurs de fichiers de configuration XML que vous voulez. Exemple:

 ... 
 public void startElement (String uri, Nom de chaîne, String nom, 
 org.xml.sax.Attributes attrs) 
 lance org.xml. sax.SAXException {
 Classe [] args = nouvelle classe [2]; 
 args [0] = uri.getClass (); 
 args [1] = org.xml. sax.Attributes.class; 
 try {
 Chaîne mname = name.replace ("-", ""); 
 Java.lang.reflect.Method m = 
 getClass (). getDeclaredMethod ("start" + mname, args); 
 m.invoke (this, nouvel objet [] {uri, (org.xml.sax.Attributes ) attrs}); 
}
catch (IllegalAccessException e) { lève une nouvelle exception RuntimeException (e); }
catch (NoSuchMethodException e) { lève une nouvelle exception RuntimeException (e); }
catch (Java.lang.reflect.InvocationTargetException e) { org.xml.sax.SAXException se = new org.xml.sax.SAXException (e.getTargetException () ); se.setStackTrace (e.getTargetException (). getStackTrace ()); }

et dans un analyseur de configuration particulier:

 public void start_Request (String uri, org.xml.sax.Attributes attrs) {
 // veille à lire les attributs correctement 
 System.err.println ("Request, name = "+ attrs.getValue (0); 
} 
0
khachik
0
Abdul Khaliq

Il existe différentes API pour lire/écrire des fichiers XML via Java. Je me référerais en utilisant StaX

Cela peut aussi être utile - API Java XML

0
Vishal