2014-05-07 56 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 +方法肯定會更高效。 –