2010-11-02 16 views
36

Soy nuevo en XML. Quiero leer el siguiente XML en función del nombre de la solicitud. Por favor, ayúdenme sobre cómo leer el siguiente XML en Java:¿Cómo recuperar el valor del elemento de XML utilizando 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, esto es muy similar a su otra pregunta aquí .. http://stackoverflow.com/questions/4013687/how-to-append-a-new-value-in-xml- using-java/4013881 # 4013881 – William

Respuesta

49

Si el XML es una cadena, entonces usted puede hacer lo siguiente:

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 el código XML está en un archivo, entonces Document document se creará una instancia de esta manera:

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

Los rendimientos que document.getDocumentElement() el nodo que es el elemento de documento del documento (en su caso <config>).

vez que haya una rootElement, puede acceder atributo del elemento (llamando al método rootElement.getAttribute()), etc. Para más métodos de org.w3c.dom.Element

Más información de java en java DocumentBuilder & DocumentBuilderFactory. Tenga en cuenta, el ejemplo proporcionado crea un árbol DOM XML, por lo que si tiene una gran cantidad de datos XML, el árbol puede ser enorme.


actualización Aquí está un ejemplo para tener "valor" del 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; 
    } 

Se puede llamar de manera efectiva como,

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

¿Por qué no utilizar la biblioteca incorporada Java SE XPath? http://stackoverflow.com/questions/4076910/how-to-retrieve-element-value-of-xml-using-java/4077986#4077986 –

+0

@Blaise Doughan, podrías. Acabo de usar DOM para admitir el java heredado que todavía está activo. –

+3

Bastante justo, si alguien todavía está en JDK 1.4 entonces su acercamiento es razonable. Si están en 1.5 o posterior, la biblioteca javax.xml.xpath es mucho más fácil.Odio ver a la gente haciendo las cosas difíciles cuando existe una mejor manera. –

4

Hay varias maneras diferentes de hacerlo. Es posible que desee consultar XStream o JAXB. Hay tutoriales y ejemplos.

+0

@sam: Y probablemente también quiera verificar esta pregunta SO, http://stackoverflow.com/questions/1558087/xstream-or-simple. –

1

Hay dos formas generales de hacerlo. O bien creará un Modelo de objetos de dominio de ese archivo XML, eche un vistazo a this

y la segunda opción es el uso de análisis basado en eventos, que es una alternativa a la representación DOM xml. Imho puedes encontrar la mejor comparación general de estas dos técnicas básicas here. Por supuesto, hay mucho más que aprender sobre el procesamiento de xml, por ejemplo, si tiene una definición de esquema XML (XSD), puede usar JAXB.

0

Existen varias API disponibles para leer/escribir archivos XML a través de Java. me remito usando StaX

También Esto puede ser útil - Java XML APIs

0

Puesto que usted está usando esto para configuración, su mejor apuesta es apache commons-configuration. Para archivos simples, es mucho más fácil de usar que los analizadores XML "en bruto".

Véase el XML how-to

0

Usted puede hacer una clase que se extiende org.xml.sax.helpers.DefaultHandler y llame

start_<tag_name>(Attributes attrs); 

y

end_<tag_name>(); 

Para que es:

start_request_queue(attrs); 

etc.

Y luego amplía esa clase e implementa los analizadores de archivos de configuración xml que desee. Ejemplo:

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

y en un analizador configuración particular:

 
    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

Si usted está buscando para obtener un único valor del XML es posible que desee utilizar la biblioteca de XPath de Java. Véase un ejemplo en mi respuesta a una pregunta anterior:

se vería algo así como:

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

¿Por qué esto no funciona en JDK1.4? – ziggy

+0

Nodo requerido encontrado NodeList en nodo Node = (NodeList) xPath.evaluate ("/ Solicitud/@ nombre", dDoc, XPathConstants.NODE); –

+0

¿Podemos lograr lo mismo con JAXB? ¿Será mejor que este enfoque? – Prateek

16

En caso de que sólo tiene una (primera) valor a recuperar de xml:

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

En caso de que quiera analizar todo el documento xml utilizar JSoup:

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

¡Muy pronto! Gracias ! @yurin – iCrazybest

+0

Bienvenido @iCrazybest. Agregué JSoup para responder, echar un vistazo. – yurin

+0

gracias por apuntar a jsoup - vainilla java es dolor en el culo aquí – dermoritz

Cuestiones relacionadas