【问题标题】:Create xml file using SSJS使用 SSJS 创建 xml 文件
【发布时间】:2014-05-07 06:36:02
【问题描述】:

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

【问题讨论】:

    标签: xpages xpages-ssjs


    【解决方案1】:

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

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

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

    告诉我们进展如何。

    更新:这将是我的@Michael 代码示例版本:

    <?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 而不是 writer(在 afterRenderResponse 事件中无法访问流)
    • 将响应设置为完成以停止页面进一步输出,因此您只需在页面上键入 cmets 它的作用
    • 辅助类的使用

    当您阅读帮助类的源代码时似乎有点奇怪:为什么不在构造函数中使用输出流,这样您就不会错过它? - 我今天会用它添加第二个构造函数,但是如果我愿意的话,无参数构造函数允许我将该类定义为托管 bean。

    【讨论】:

      【解决方案2】:

      按照@Stefan 的建议在字符串中“呈现”XML,我将使用 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() 中的行以满足您的需要。

      【讨论】:

      • 几乎不错 :-) - 使用单独的 write() 语句代替字符串连接,并使用一些 XML 类(sax、dom)而不是字符串。否则编码会在你意想不到的时候咬你
      • 当然,Domino 需要设置为使用 UTF-8 对 HTTP 输出进行编码,并且真正的解析肯定要好得多 - 但如果您只需要在 XML 结构中分发一些简单的信息,它不使用附加包会更容易。还有一件事:如果您使用字符串 concat 方法(具有所有缺陷),那么使用 Array.join() 方法而不是 String + 方法肯定会更高效...
      猜你喜欢
      • 2016-06-22
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多