2014-05-07 55 views
3

我想在服务器上使用SSJS创建一个xml文件。有没有办法做到这一点?任何人都可以请示例代码来创建服务器上的xml文件。使用SSJS创建xml文件

回答

6

有很多方法。看起来最简单的一个是创建一个看起来像XML的字符串。

下一个会使用Java DOM类。有an article描述它。

最后,你可以使用SAX一点点helper class

让我们知道如何去。

更新:这将是我的版本@迈克尔的代码示例:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- XPage which is not rendered but returns data like XML, JSON, etc.  --> 
<!-- More: http://www.wissel.net/blog/d6plinks/shwl-7mgfbn     --> 

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false"> 
    <xp:this.beforeRenderResponse><![CDATA[#{javascript:try { 
    var out = facesContext.getOutputStream(); 
    var exCon = facesContext.getExternalContext(); 
    var response = exCon.getResponse(); // get the response context 
    // set content type, e.g. ... 
    response.setContentType("text/xml"); 
    // set caching option 
    response.setHeader("Cache-Control", "no-cache"); 
    // write XML output ... 
    var result = new biz.taoconsulting.xmltools.SimpleXMLDoc(); 
    result.setOut(out); 
    result.openTag("result"); 
    result.dateTag("created", new java.util.Date()); 
    result.addSimpleTag("Author",@UserName); 
    result.openTag("FruitList"); 
    result.addComment("Stephan really likes the fruits example"); 
    var attributes = new java.util.HashMap(); 
    attributes.add("name","Durian"); 
    attributes.add("color","white"); 
    attributes.add("taste","Don't ask"); 
    result.addEmptyTag("fruit",attributes); 
    result.closeDocument(); 
    // close the output 
    exCon.responseComplete(); 
    out.close(); 
} catch (e) { 
    print(e.toString()); 
}}]]> 
    </xp:this.beforeRenderResponse> 
</xp:view> 

注意这里的区别:

  • 我使用beforeRenderResponse事件
  • 访问的OutputStream,而不是写入器(流在afterRenderResponse事件中不可访问)
  • 设置响应完成t O停止进一步输出的页面,这样你就可以简单地输入它做什么
  • 使用辅助类

,当你阅读的辅助类的来源是什么,似乎有点古怪的网页上留言:为什么不在构造函数中使用输出流,所以你不会错过它? - 我今天会添加第二个构造函数,但无参数构造函数允许我将该类定义为托管bean,如果我喜欢它的话。

6

到“渲染” XML的一个String作为@Stefan建议我将使用XAgent方法:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- XPage which is not rendered but returns data like XML, JSON, etc.  --> 
<!-- More: http://www.wissel.net/blog/d6plinks/shwl-7mgfbn     --> 

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false"> 
    <xp:this.afterRenderResponse><![CDATA[#{javascript:try { 
    var writer = facesContext.getResponseWriter(), // get a writer object 
     response = facesContext.getExternalContext().getResponse(); // get the response context 
    // set content type, e.g. ... 
    response.setContentType("text/xml"); 
    // set caching option 
    response.setHeader("Cache-Control", "no-cache"); 
    // write XML output ... 
    writer.write(
     '<?xml version="1.0"?>\n' 
     + '<root>\n' 
     + '<entity>Example Content</entity>\n' 
     + '</root>\n' 
    ); 
    // close the stream 
    writer.endDocument(); 
} catch (e) { 
    print(e.toString()); 
}}]]> 
    </xp:this.afterRenderResponse> 
    <xp:this.resources> 
     <xp:script src="/XBAN.jss" clientSide="false"></xp:script> 
    </xp:this.resources> 
</xp:view> 

简单地把他的代码到一个新创建的XPage并对其进行测试。修改writer.write()中的行以适应您的需求。

+0

几乎不错:-) - 而不是字符串连接使用单独的write()语句,并使用一些XML类(sax,dom)而不是String。否则编码会咬你,当你不希望它 – stwissel

+0

肯定,需要设置Domino以UTF-8编码HTTP输出,真正的解析肯定是更好 - 但如果你只需要提供一些简单的信息在一个XML结构,不使用额外的软件包会更容易。还有一件事:如果你使用字符串concat方法(及其所有的缺陷),那么使用Array.join()方法而不是String +方法肯定会更高效。 –