2010-11-02 8 views
36

Sono nuovo di XML. Voglio leggere il seguente XML sulla base del nome della richiesta. Per favore aiutami su come leggere il sotto XML in Java -Come recuperare il valore dell'elemento XML usando 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> 
+1

Err, questo è molto simile alla vostra altra domanda qui .. http://stackoverflow.com/questions/4013687/how-to-append-a-new-value-in-xml- using-java/4013881 # 4013881 – William

risposta

49

Se il vostro XML è una stringa, allora si può fare quanto segue:

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(); 

Se il vostro XML è in un file, poi Document document vengono istanziati in questo modo:

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

Le document.getDocumentElement() si ritorna il nodo che è l'elemento del documento del documento (nel tuo caso <config>).

volta che hai un rootElement, è possibile accedere attributo dell'elemento (chiamando rootElement.getAttribute() metodo), ecc Per ulteriori metodi su org.w3c.dom.Element

Informazioni di Java su Java DocumentBuilder & DocumentBuilderFactory. Ricordare, l'esempio fornito crea un albero DOM XML, quindi se si dispone di un enorme dati XML, l'albero può essere enorme.


Aggiornamento Ecco un esempio per ottenere "valore" di un elemento <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; 
    } 

Si può effettivamente chiamare come,

String requestQueueName = getString("requestqueue", element); 
+3

Perché non utilizzare la libreria Java XP SE integrata? http://stackoverflow.com/questions/4076910/how-to-retrieve-element-value-of-xml-using-java/4077986#4077986 –

+0

@Blaise Doughan, potresti. Ho appena usato DOM per supportare legacy java che sono ancora attivi là fuori. –

+3

Abbastanza corretto, se qualcuno è ancora su JDK 1.4, il tuo approccio è ragionevole. Se sono su 1.5 o successivi, la libreria javax.xml.xpath è molto più semplice.Odio vedere le persone fare le cose nel modo più duro quando esiste un modo migliore. –

4

Ci sono diversi modi per farlo. Si consiglia di controllare XStream o JAXB. Ci sono tutorial e gli esempi.

+0

@sam: E probabilmente vorrai controllare anche questa domanda SO, http://stackoverflow.com/questions/1558087/xstream-or-simple. –

1

Ci sono due modi generali di farlo. Dovrai creare un modello a oggetti di dominio di quel file XML, dare un'occhiata a this

e la seconda scelta consiste nell'utilizzare l'analisi guidata dagli eventi, che è un'alternativa alla rappresentazione DOM xml. Imho è possibile trovare il miglior confronto generale tra queste due tecniche di base here. Naturalmente ci sono molte altre informazioni sull'elaborazione di XML, ad esempio se viene fornita la definizione dello schema XML (XSD), è possibile utilizzare JAXB.

0

Esistono varie API per leggere/scrivere file XML tramite Java. Mi riferisco usando StaX

Anche questo può essere utile - Java XML APIs

0

Dal momento che si sta utilizzando questo per configurazione, la soluzione migliore è apache commons-configuration. Per i file semplici è molto più semplice da usare rispetto ai parser XML "grezzi".

Vedi l'XML how-to

0

si può fare una classe che estende org.xml.sax.helpers.DefaultHandler e chiamare

start_<tag_name>(Attributes attrs); 

e

end_<tag_name>(); 

perché è:

start_request_queue(attrs); 

ecc.

E quindi estende quella classe e implementa i parser di file di configurazione xml che si desidera. Esempio:

 
    ... 
    public void startElement(String uri, String name, String qname, 
          org.xml.sax.Attributes attrs) 
        throws org.xml.sax.SAXException { 
    Class[] args = new Class[2]; 
    args[0] = uri.getClass(); 
    args[1] = org.xml.sax.Attributes.class; 
    try { 
     String mname = name.replace("-", ""); 
     java.lang.reflect.Method m = 
      getClass().getDeclaredMethod("start" + mname, args); 
     m.invoke(this, new Object[] { uri, (org.xml.sax.Attributes)attrs }); 
    }
catch (IllegalAccessException e) { throw new RuntimeException(e); }
catch (NoSuchMethodException e) { throw new 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()); }

e in una particolare parser di configurazione:

 
    public void start_Request(String uri, org.xml.sax.Attributes attrs) { 
    // make sure to read attributes correctly 
    System.err.println("Request, name="+ attrs.getValue(0); 
    } 

23

Se si sta solo cercando di ottenere un singolo valore dalla XML si consiglia di utilizzare libreria XPath di Java. Per un esempio vedere la mia risposta a una domanda precedente:

dovrebbe apparire qualcosa di simile:

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(); 
     } 
    } 

} 
+0

Perché questo non funziona su JDK1.4? – ziggy

+0

Nodo richiesto trovato NodeList sul nodo node = (NodeList) xPath.evaluate ("/ Request/@ name", dDoc, XPathConstants.NODE); –

+0

possiamo ottenere lo stesso usando JAXB? Sarà meglio di questo approccio? – Prateek

16

Nel caso in cui è sufficiente un (primo) valore da recuperare dal xml:

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

Nel caso in cui si desidera analizzare tutto il documento xml utilizzare JSoup:

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

A brevissimo! Grazie ! @ yurin – iCrazybest

+0

Benvenuto @iCrazybest. Ho aggiunto JSoup per rispondere, dare un'occhiata. – yurin

+0

grazie per indicare a jsoup - vanilla java è dolore nel culo qui – dermoritz

Problemi correlati