2010-05-13 17 views
17

Estoy tratando de crear un servicio web RESTful usando un Servlet Java. El problema es que tengo que pasar a través de un método POST a un servidor web una solicitud. El contenido de esta solicitud no es un parámetro sino el cuerpo mismo.Usando una cadena dentro del método de análisis DocumentBuilder (lo necesito para analizar XML usando XPath)

Así que, básicamente, de rubí enviar algo como esto:

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 } 

entonces tengo que recuperar el cuerpo de esta solicitud en mi servlet. Uso la línea de lectura clásica, así que tengo una cadena. El problema es cuando tengo que analizarlo como 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()); 
    } 
} 

El problema es que builder.parse() acepta: parse(File f), parse(InputSource is), parse(InputStream is).

¿Hay alguna manera de que pueda transformar mi cadena xml en un InputSource o algo así? Sé que podría ser una pregunta tonta pero Java no es lo mío, me veo obligado a usarlo y no soy muy habilidoso.

+0

Gracias Dimitre para la edición. Me estoy acostumbrando a este código de formato. – dierre

+0

¿Se puede publicar un XML de muestra que funcione con este código? Estoy trabajando en un diseño similar y mi nodo, después de la consulta xpath vuelve nulo, así que sospecho que mi expresión xpath o mi xml no está bien formado. – mobibob

Respuesta

49

Se puede crear un InputSource de una cadena a través de un StringReader:

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

Con su cadena, utilice algo como:

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

ByteArrayInputStream es un InputStream.

Cuestiones relacionadas