Подтвердить что ты не робот

Использование строки внутри метода анализа DocumentBuilder (нужно для анализа XML с использованием XPath)

Я пытаюсь создать веб-сервис RESTful с помощью Java Servlet. Проблема в том, что я должен передать через метод POST запрос на веб-сервер. Содержимое этого запроса не является параметром, кроме самого тела.

Итак, я в основном посылаю из Ruby что-то вроде этого:

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 }

Затем мне нужно получить тело этого запроса в моем сервлете. Я использую классическую readline, поэтому у меня есть строка. Проблема в том, когда я должен разбирать его как 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()); 
  }
}

Проблема заключается в том, что builder.parse() принимает: parse(File f), parse(InputSource is), parse(InputStream is).

Есть ли способ преобразовать мою XML-строку в InputSource или что-то в этом роде? Я знаю, что это может быть фиктивный вопрос, но Java не моя вещь, я вынужден использовать ее, и я не очень квалифицирован.

4b9b3361

Ответ 1

Вы можете создать InputSource из строки с помощью StringReader:

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

Ответ 2

С помощью вашей строки используйте что-то вроде:

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

ByteArrayInputStream - это InputStream.