2010-10-11 22 views
19

¿cómo se analiza el xml almacenado en un objeto de cadena java?analizar una cadena xml en java?

XMLReader de Java solo analiza documentos XML desde un URI o inputstream. ¿no es posible analizar desde una cadena que contiene datos xml?

En este momento tengo los siguientes:

try { 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser sp = factory.newSAXParser(); 
    XMLReader xr = sp.getXMLReader(); 

    ContactListXmlHandler handler = new ContactListXmlHandler(); 
    xr.setContentHandler(handler); 
    xr.p 
} catch (ParserConfigurationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (SAXException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Y en mi manejador tengo esto:

public class ContactListXmlHandler extends DefaultHandler implements Resources { 

    private List<ContactName> contactNameList = new ArrayList<ContactName>(); 

    private ContactName contactItem; 

    private StringBuffer sb; 

    public List<ContactName> getContactNameList() { 
     return contactNameList; 
    } 

    @Override 
    public void startDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     super.startDocument(); 

     sb = new StringBuffer(); 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     // TODO Auto-generated method stub 
     super.startElement(uri, localName, qName, attributes); 
     if(localName.equals(XML_CONTACT_NAME)){ 
      contactItem = new ContactName(); 
     } 

     sb.setLength(0); 

    } 

    @Override 
    public void characters(char[] ch, int start, int length){ 
     // TODO Auto-generated method stub 
     try { 
      super.characters(ch, start, length); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     sb.append(ch, start, length); 
    } 

    @Override 
    public void endDocument() throws SAXException { 
     // TODO Auto-generated method stub 
     super.endDocument(); 
    } 

    /** 
    * where the real stuff happens 
    */ 
    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     // TODO Auto-generated method stub 
     //super.endElement(arg0, arg1, arg2); 

     if(contactItem != null){ 
      if (localName.equalsIgnoreCase("title")) { 
       contactItem.setUid(sb.toString()); 
       Log.d("handler", "setTitle = " + sb.toString()); 

      } else if (localName.equalsIgnoreCase("link")) { 
       contactItem.setFullName(sb.toString()); 

      } else if (localName.equalsIgnoreCase("item")){ 
       Log.d("handler", "adding rss item"); 
       contactNameList.add(contactItem); 
      } 

      sb.setLength(0); 
     } 
} 

Gracias de antemano

+1

puede mirar esto: http://stackoverflow.com/questions/247161/how-do-i-turn-a-string-into-a-stream-in -java – foret

Respuesta

41

El SAXParser puede read un InputSource.

Un InputSource puede tomar un lector en su constructor

Por lo tanto, se puede poner cadena XML de análisis a través de una StringReader

new InputSource(new StringReader("... your xml here...."))); 
+1

ch compañero, compañero parece haber funcionado – jonney

1

Tome un vistazo a esto: http://www.rgagnon.com/javadetails/java-0573.html

import javax.xml.parsers.*; 
import org.xml.sax.InputSource; 
import org.w3c.dom.*; 
import java.io.*; 

public class ParseXMLString { 

    public static void main(String arg[]) { 
    String xmlRecords = 
     "<data>" + 
     " <employee>" + 
     " <name>John</name>" + 
     " <title>Manager</title>" + 
     " </employee>" + 
     " <employee>" + 
     " <name>Sara</name>" + 
     " <title>Clerk</title>" + 
     " </employee>" + 
     "</data>"; 

    try { 
     DocumentBuilderFactory dbf = 
      DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(xmlRecords)); 

     Document doc = db.parse(is); 
     NodeList nodes = doc.getElementsByTagName("employee"); 

     // iterate the employees 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Element element = (Element) nodes.item(i); 

      NodeList name = element.getElementsByTagName("name"); 
      Element line = (Element) name.item(0); 
      System.out.println("Name: " + getCharacterDataFromElement(line)); 

      NodeList title = element.getElementsByTagName("title"); 
      line = (Element) title.item(0); 
      System.out.println("Title: " + getCharacterDataFromElement(line)); 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    /* 
    output : 
     Name: John 
     Title: Manager 
     Name: Sara 
     Title: Clerk 
    */  

    } 

    public static String getCharacterDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
     CharacterData cd = (CharacterData) child; 
     return cd.getData(); 
    } 
    return "?"; 
    } 
} 
1

Su XML podría ser lo suficientemente simple para analizar de forma manual utilizando la DOM o SAX API, pero igual sugeriría usar una API de serialización XML como JAXB, XStream o Simple en lugar de escribir su propia serialización/deser XML el código de identificación es un arrastre.

Tenga en cuenta que la xstream FAQ erróneamente afirma que debe utilizar clases generadas con JAXB:

¿Cómo lo hace xstream comparar con JAXB (Java API para XML Binding)?

JAXB es una herramienta de enlace de Java. Genera código Java a partir de un esquema y puede transformar esas clases en XML que coincida con el esquema procesado y viceversa. Tenga en cuenta que no puede usar sus propios objetos, tiene que usar lo que se genera.

Parece que esto era cierto era cierto al mismo tiempo, pero JAXB 2.0 ya no requiere el uso de clases Java generadas a partir de un esquema.

Si usted va esta ruta, asegúrese de revisar las comparaciones de lado a lado de la serialización/API cálculo de referencias que he mencionado:

http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-simple.html

Cuestiones relacionadas