2009-06-23 12 views

risposta

5

Ho finito per utilizzare JAXP con l'API SAX.

Aggiungendo qualcosa come il seguente al mio servlet:

import org.xml.sax.*; 
import org.xml.sax.helpers.*; 
import javax.xml.parsers.*; 

.... 

InputStream in = connection.getInputStream(); 

InputSource responseXML = new InputSource(in); 
final StringBuilder response = new StringBuilder(); 
DefaultHandler myHandler = new DefaultHandler() { 

    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     if (localName.equals("elementname")) { 
      response.append(attributes.getValue("attributename")); 
      inElement = true; 
     } 
    } 
    public void characters(char [] buf, int offset, int len) { 
     if (inElement) { 
      inElement = false; 
      String s = new String(buf, offset, len); 
      response.append(s); 
      response.append("\n"); 
     } 
    } 
}; 

SAXParserFactory factory = SAXParserFactory.newInstance(); 
try { 
    SAXParser parser = factory.newSAXParser(); 
    parser.parse(responseXML, myHandler); 
} catch (ParserConfigurationException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (SAXException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

in.close(); 
connection.disconnect(); 

.... 
2

Xerces (che fornisce sia SAX e le implementazioni DOM) e Xalan (che fornisce il supporto per le trasformazioni) - entrambi sono stati in bundle con il JDK dal 1.5 e sono quindi già configurato in un Java standard di installazione

+1

la JVM fornita da App Engine non è un'installazione standard di Java. Sai se sono disponibili su di esso? –

+0

Ciao Sam - Non ho usato Google App Engine, ma una rapida scansione dei documenti suggerisce che è solo Java 6 con alcune limitazioni di sicurezza. Dai un'occhiata qui: http://code.google.com/appengine/docs/whatisgoogleappengine.html –

+0

Xerces non è attualmente supportato da AppEngine. Problemi di sicurezza –

2

Dipende che cosa il vostro gli obiettivi sono suppongo. Ho usato JAXB per il marshalling/unmarshalling xml per oggetti Java ed è abbastanza veloce, facilmente estensibile e ha un buon supporto per la comunità.

Se non vuoi scrivere schemi e cosa no, allora ho avuto fortuna con dom4j e ha una curva di apprendimento più piccola.

+0

Yuck, voglio elaborare XML; Non voglio dover scrivere niente da solo, quindi JAXB è fuori. –

+0

È inoltre possibile utilizzare le annotazioni per contrassegnare gli oggetti a cui si desidera associare. Personalmente non ho usato questo approccio ma ti farebbe risparmiare dover scrivere uno schema. Devo ammettere che JAXB può facilmente essere eccessivo per molte applicazioni. –

0

JDom ha un'interfaccia migliore (più semplice) rispetto agli apis Java XML standard.

0

è possibile utilizzare esattamente le stesse librerie utilizzate in un ambiente non servlet.

+0

LOL - Stavo pensando la stessa cosa ... –

+1

Beh, non tutto funziona su GAE ... – Thilo

0

Un'altra scelta, che ha una velocità migliore di Xerces (l'ultima volta che li ho confrontati) era Saxon.

2

È possibile utilizzare JDOM che richiede xerces SAXParser. Tuttavia, AppEngine non fornisce la libreria xerces. Puoi aggiungerlo copiandolo nella piega WEB-INF/lib del tuo progetto.

1
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 


    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException { 
     String content = req.getParameter("content"); 
     Document doc = parseXml(content); 
     resp.setContentType("text/plain"); 
     if (doc != null) 
     { 
      resp.getWriter().println(doc.getDocumentElement().getNodeName()); 
     } 
     else 
     { 
      resp.getWriter().println("no input/bad xml input. please send parameter content=<xml>"); 
     } 
    } 

    private static Document parseXml(String strXml) 
    { 
     Document doc = null; 
     String strError; 
     try 
     { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 

      StringReader reader = new StringReader(strXml); 
      InputSource inputSource = new InputSource(reader); 

      doc = db.parse(inputSource); 

      return doc; 
     } 
     catch (IOException ioe) 
     { 
      strError = ioe.toString(); 
     } 
     catch (ParserConfigurationException pce) 
     { 
      strError = pce.toString(); 
     } 
     catch (SAXException se) 
     { 
      strError = se.toString(); 
     } 
     catch (Exception e) 
     { 
      strError = e.toString(); 
     } 

     log.severe("parseXml: " + strError); 
     return null; 
    } 
Problemi correlati