2010-05-13 2 views
17

Ich versuche, einen RESTful Webservice mit einem Java-Servlet zu erstellen. Das Problem ist, dass ich via POST-Methode eine Anfrage an einen Webserver weitergeben muss. Der Inhalt dieser Anfrage ist kein Parameter, sondern der Körper selbst.Verwenden einer Zeichenfolge innerhalb der DocumentBuilder-Parse-Methode (benötigt für das Parsen von XML mit XPath)

So sende ich im Grunde von Ruby etwas wie folgt aus:

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 } 

Dann muss ich den Körper von dieser Anfrage in meinem Servlet abrufen. Ich benutze die klassische readline, also habe ich eine Zeichenfolge. Das Problem ist, wenn ich es als XML zu analysieren haben:

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

Das Problem ist, dass builder.parse() akzeptiert: parse(File f), parse(InputSource is), parse(InputStream is).

Gibt es eine Möglichkeit, wie ich meine XML-Zeichenfolge in eine InputSource oder etwas ähnliches umwandeln kann? Ich weiß, es könnte eine Pseudofrage sein, aber Java ist nicht mein Ding, ich bin gezwungen, es zu benutzen, und ich bin nicht sehr geschickt.

+0

Danke Dimitre für die Bearbeitung. Ich gewöhne mich an diesen Formatcode. – dierre

+0

Können Sie Beispiel-XML-Dateien posten, die mit diesem Code funktionieren? Ich arbeite an einem ähnlichen Entwurf und mein Knoten, der der xpath Abfrage folgt, kommt zurück null, also vermute ich, dass mein xpath Ausdruck oder mein xml nicht gut-gebildet ist. – mobibob

Antwort

49

Sie können eine Input aus einem String durch einen String erstellen:

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

Mit der Zeichenfolge, verwenden so etwas wie:

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

ByteArrayInputStream ist ein Input.