2012-02-07 102 views
1

在我的控制器的方法,看起来像这样:我如何将XML字符串转换为XML文件下载

@RequestMapping(value = "/test", method = RequestMethod.GET) 
public @ResponseBody String getNameAsXML(HttpServletRequest httpRequest, @RequestParam("name") String name) 
{ 
    ... some logic goes here to get the data from the db 
    by name and convert it to valid xml string 
    ... 
     return xmlString; 
} 

的xmlString是我希望返回XML字符串表示。

当我运行这个方法时,我可以在浏览器中看到xml,但是我想给用户一个下载弹出窗口,让他下载这个xml文件而不是在浏览器中显示它。

我想过要返回MultipartFile而不是String,但不太确定该怎么做。

+0

看看http://stackoverflow.com/a/6520353/320180。 – 2012-02-07 08:44:32

回答

3

这可以通过将响应头中的“Content-Disposition”设置为“attachment =”来实现。将响应类型设置为正确的MIME类型(“text/xml”)是一种很好的做法。但是,这可能已经自动完成。

+0

我也面临同样的情况,我的意思是,我可以在浏览器中看到xml,但只显示值(没有对应的xml标签)。我可以在浏览器的页面源中看到整个xml。对于使用response.setHeader(“Content-Disposition”,“attachment =”);我是否需要在我的类路径中有任何文件,或者是否必须将xml字符串的内容写入该文件? – Sudip7 2014-11-19 12:21:38

+0

附件的值只是告诉浏览器最初将文件保存为的内容。这听起来像你需要指定正确的MIME类型,以便浏览器将呈现XML文档,而不是将其解析为HTML。 – Seidr 2014-11-19 13:39:00

+0

请以任何方式纠正我的错误。 m发布了我的代码的快照。 'public @ResponseBody String getVMdata(...){ ... .. HttpEntity resEnity = response.getEntity(); \t \t \t content = EntityUtils.toString(resEnity); \t \t \t response.setHeader(“Content-Type”,“application/xml”); \t \t \t response.setHeader(“Content-Disposition”,“attachment =”); \t \t \t返回内容; ''''。内容的值为' ...'的格式。 – Sudip7 2014-11-20 04:17:06

0

你可以从字符串在java中创建XML文件如下:

public static void main(String[] args) { 
     String xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"></soap:Envelope>"; 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

     DocumentBuilder builder; 
     try 
     { 
      builder = factory.newDocumentBuilder(); 

      // Use String reader 
      Document document = builder.parse(new InputSource( 
        new StringReader(xmlString))); 

      TransformerFactory tranFactory = TransformerFactory.newInstance(); 
      Transformer aTransformer = tranFactory.newTransformer(); 
      Source src = new DOMSource(document); 
      Result dest = new StreamResult(new File("xmlFileName.xml")); 
      aTransformer.transform(src, dest); 
     } catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

然后提供链接到一个文件,以便用户可以下载它。

参阅http://www.coderanch.com/t/512978/java/java/convert-string-xml-file-java

也参阅http://www.java.happycodings.com/XML/code17.html

+0

我遵循你的指令从xml字符串创建一个dom,这里是一个快照。 'public @ResponseBody String getVMdata(...){ ... .. HttpEntity resEnity = response.getEntity(); \t \t \t含量= EntityUtils.toString(resEnity \t \t \t \t \t \t \t \t \t \t \t \t结果DEST =新StreamResult(新文件(。 “C:\\ sample1.xml”)) ; \t \t \t aTransformer.transform(SRC,目标寄存器); \t \t \t response.setHeader( “内容类型”,“应用A N/XML“); \t \t \t response.setHeader( “内容处置”, \t \t \t \t \t“附件;文件名= C:\\ sample1.xml); \t \t \t返回内容 \t \t \t}'但是米。无法在浏览器中看到任何链接。我的编码有什么问题? – Sudip7 2014-11-20 07:32:36

0

我结束了加入response.setHeader("Content-Disposition", "attachment; filename=test.xml");上述控制器的方法和它工作正常。

我对此解决方案并不满意,因为我正在寻找更多的Spring配置,而不是对响应对象进行破解,所以如果有人有更好的主意,那么请分享。

感谢您对上面的答复,但我认为他们只是为黑客像我:)