代码之家  ›  专栏  ›  技术社区  ›  dierre

在DocumentBuilder解析方法中使用字符串(使用XPath解析XML时需要它)[duplicate]

  •  17
  • dierre  · 技术社区  · 16 年前

    我正在尝试使用Javaservlet创建一个RESTfulWebService。问题是我必须通过POST方法向web服务器传递一个请求。此请求的内容不是参数,而是主体本身。

    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 }
    

    然后我必须在servlet中检索这个请求的主体。我使用经典的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) .

    有什么方法可以在InputSource或类似的东西中转换我的xml字符串吗?我知道这可能是一个虚拟的问题,但Java不是我的东西,我被迫使用它,我不是很熟练。

    2 回复  |  直到 16 年前
        1
  •  51
  •   Don Roby    16 年前

    您可以通过StringReader从字符串创建InputSource:

    Document doc = builder.parse(new InputSource(new StringReader(soft)));
    
        2
  •  3
  •   Istao    16 年前

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

    ByteArrayInputStream 是输入流。