2010-05-13 10 views
17

Sto provando a creare un webservice RESTful utilizzando un servlet Java. Il problema è che devo passare tramite un metodo POST a una richiesta di un server web. Il contenuto di questa richiesta non è un parametro ma il corpo stesso.Utilizzo di una stringa all'interno del metodo di analisi DocumentBuilder (necessario per l'analisi XML utilizzando XPath)

Così ho praticamente inviare dal rubino qualcosa di simile:

url = URI.parse(@host) 
req = Net::HTTP::Post.new('/WebService/WebServiceServlet') 
req['Content-Type'] = "text/xml" 
# req.basic_auth 'account', 'password' 
req.body = data 
response = Net::HTTP.start(url.host, url.port){ |http| puts http.request(req).body } 

allora devo recuperare il corpo di questa richiesta nel mio servlet. Io uso la lettura classica, quindi ho una stringa. Il problema è quando devo analizzare come XML:

private void useXML(final String soft, final PrintWriter out) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException, FileNotFoundException { 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(true); // never forget this! 
    DocumentBuilder builder = domFactory.newDocumentBuilder(); 
    Document doc = builder.parse(soft); 

    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xpath = factory.newXPath(); 
    XPathExpression expr = xpath.compile("//software/text()"); 

    Object result = expr.evaluate(doc, XPathConstants.NODESET); 
    NodeList nodes = (NodeList) result; 
    for (int i = 0; i < nodes.getLength(); i++) { 
    out.println(nodes.item(i).getNodeValue()); 
    } 
} 

Il problema è che builder.parse() accetta: parse(File f), parse(InputSource is), parse(InputStream is).

C'è un modo per trasformare la mia stringa xml in un InputSource o qualcosa del genere? So che potrebbe essere una domanda falsa, ma Java non è il mio genere, sono costretto a usarlo e non sono molto abile.

+0

Grazie Dimitre per l'editing. Mi sto abituando a questo codice di formato. – dierre

+0

Puoi pubblicare esempi di codice XML che funzionano con questo codice? Sto lavorando su un progetto simile e il mio nodo, dopo che la query xpath sta tornando null, quindi sospetto che la mia espressione xpath o il mio xml non sia ben formato. – mobibob

risposta

49

È possibile creare un InputSource da una stringa per mezzo di uno StringReader:

Document doc = builder.parse(new InputSource(new StringReader(soft))); 
3

Con la stringa, usare qualcosa come:

ByteArrayInputStream input = 
new ByteArrayInputStream(yourString.getBytes(perhapsEncoding)); 
builder.parse(input); 

ByteArrayInputStream è un InputStream.

Problemi correlati