سؤال

I want to create a xml file using SSJS on server. Is there a way to do so? Can anyone please give a sample code to create a xml file on server.

هل كانت مفيدة؟

المحلول

There are quite some ways. The seemingly easiest one is to create a string that looks like XML.

The next one would be the use of Java DOM classes. There is an article describing it.

Finally you can use SAX with a little helper class

Let us know how it goes.

Update: This would be my version of @Michael's code sample:

<?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>

Note the differences here:

  • I use the beforeRenderResponse event
  • Access to outputStream instead of writer (stream is not accessible in the afterRenderResponse event)
  • set the response complete to stop the page from further output, so you can simply type comments on the page what it does
  • use of the helper class

What seems a little odd when you read the source of the helper class: why not use the output stream in the constructor, so you won't miss it? - I would today add a second constructor with that, but the parameterless constructor allow me to define that class as a managed bean if I fancy that.

نصائح أخرى

to "render" XML in a String as @Stefan suggested I would use the XAgent approach:

<?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>

Simply put his code into a newly created XPage and test it. Modify the lines in writer.write() to fit to your needs.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top