Struts2+Hibernate+Spring开发,Struts2的Action怎样输出一个xml文件,这个文件的内容组成是由数据库中的用户表中的相关字段构成,比如:
 <?xml version="1.0" encoding="big5" ?> 
- <data>
- <user>
  <name>cary</name> 
  <ip>192.168.1.1</ip> 
  <state>0</state> 
  </user>
- <user>
  <name>apple</name> 
  <ip>192.168.1.1</ip> 
  <state>0</state> 
  </user>
  </data>

解决方案 »

  1.   

    你从action里面获取数据库的列表就好生成了,下面是一个demo可以参考一下package com.myservlet;import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    public class DataToXML {
     YourService yourService=new YourService ();
    private static Document document;
     //private String filename="mydata.xml";
     static{
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     DocumentBuilder builder;
    try {
    builder = factory.newDocumentBuilder();
     document = builder.newDocument();
    } catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }  }
       //生成xml列表
       public void writeToXMLList(String name,String filename){
       List list=yourService.getMessageByName(name);//查询出你需要的数据列表
       Element root=document.createElement("data");
        document.appendChild(root);
       for(int i=0;i<list.size();i++){
       YourDomain input=(YourDomain)list.get(i);
                         
        Element ele=document.createElement("user");
                                 
        root.appendChild(ele);
        
        Element id=document.createElement("name");
        id.setTextContent(input.getName()+"");
        ele.appendChild(id);
        
        Element name1=document.createElement("ip");
        name1.setTextContent(input.getIp());
        ele.appendChild(name1);
        
        Element lng=document.createElement("status");
        status.setTextContent(input.getLng()+"");
        ele.appendChild(status);
        
       }
         this.saveXML(filename);
       }
       private void saveXML(String filename){
       try {
         TransformerFactory tf = TransformerFactory.newInstance();
         Transformer transformer = tf.newTransformer();
         DOMSource source = new DOMSource(document);
         transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");
         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
         PrintWriter pw = new PrintWriter(new FileOutputStream(filename));
         StreamResult result = new StreamResult(pw);
         transformer.transform(source, result);
         } catch (TransformerException mye) {
         mye.printStackTrace();
         } catch (IOException exp) {
         exp.printStackTrace();
         }
       }
       
    }
      

  2.   

    To:lileixy123 :
           首先要谢谢你的代码,这里有
        Element lng=document.createElement("status"); 
        status.setTextContent(input.getLng()+""); 
        ele.appendChild(status);      status应改为lng。另外一个就是还没有搞清楚的,怎样把它返回都界面上,我们给一个URL,点击是就打开一个页面,这个页面的内容就是上面的XML文件内容?
      

  3.   

    我查了一下,希望对楼主有帮助:
    struts的resultType可以返回XSL Result,可以看struts2自带的app中的showcase例子,这个例子比较简单
    再结合http://wiki.javascud.org/display/ww2cndoc/XSL+Result不过楼主还需要学习一下xsl,所以还得看下这里
    http://www.ibm.com/developerworks/cn/xml/theme/x-xsl.html
      

  4.   

    谢谢3楼的帮忙,这些我得花个半天一天时间才能看完,有没有像jsp那样直接用out.println()的形式,感觉那样更简单,我现在按照1楼的方式应当是可以把xml文件构成,当怎样弄到界面上呢,比如一个链接话一个按钮,一点它就直接通过IE打开xml文件》?
      

  5.   

    <result type='XSL Result '>
      

  6.   

    type="xslt" filename在配置文件里配置的,还是不行,当我点击按钮,触发 writeToXMLList(),返回SUCCESS,控制台那一直在闪日志,好像是死循环。程序里是没有死死循环的啊?
      

  7.   

    用一楼的方法,你已经能够生成一个xml文件了?那简单了呀,直接response.sendRedirect("相对路径/xxx.xml");
      

  8.   

    PrintWriter out = response.getWriter();response.setContentType("text/xml");response.setHeader("Cache-Control", "no-cache");
                
    out.println("<response>");
    ...            out.close(); 
      

  9.   

    首先很感谢各位积极地给予我帮助。我在网上找了一个例子是mainAction_3.test:以此为参考正好符合我的要求,我用的是繁体系统,数据库也是繁体的,项目里我统一用GBK编码,但好像xml文件的编码好像是utf-8,现在我有新问题了,
    outPut = new String(outPut.getBytes("utf8"), "ISO-8859-1");byte[] byteArray = xml.getBytes("utf8");第一次是正常打开xml文件,汉字不会乱码,但当我刷新一遍是就乱码了,调试了几种中文处理代码,但还是不能解决刷新乱码问题。还望各位继续给予帮助。