Skip to Content.
Sympa Menu

xom-interest - Re: [XOM-interest] A novel approach for writing large XML documents with XOM

xom-interest AT lists.ibiblio.org

Subject: XOM API for Processing XML with Java

List archive

Chronological Thread  
  • From: Tatu Saloranta <cowtowncoder AT yahoo.com>
  • To: Wolfgang Hoschek <wolfgang.hoschek AT mac.com>, Asgeir Frimannsson <asgeirf AT gmail.com>
  • Cc: xom-interest AT lists.ibiblio.org
  • Subject: Re: [XOM-interest] A novel approach for writing large XML documents with XOM
  • Date: Mon, 22 Oct 2007 11:00:36 -0700 (PDT)

As usual, there are numerous ways to skin the cat. :-)

StaxMate (http://staxmate.codehaus.org) implements a simple object-based
abstraction over 'raw' streaming xml outputter (Stax XMLStreamWriter), and
its output side works in way similar to Asgeir serializer if I understood
description correctly.
StaxMate writer-side abstraction is based on output context objects
(document, element), which will write added content as soon as it is
guaranteed to be possible without buffering. This is generally right away,
only exception being when placeholders are added to explicitly allow
out-of-doc-order insertion of content, for example when something needs to be
calculated to be added as an attribute of a parent node. The reason that
output is usually output in fully streaming manner is because content is
always added using append methods.

-+ Tatu +-

----- Original Message ----
From: Wolfgang Hoschek <wolfgang.hoschek AT mac.com>
To: Asgeir Frimannsson <asgeirf AT gmail.com>
Cc: xom-interest AT lists.ibiblio.org
Sent: Monday, October 22, 2007 9:52:11 AM
Subject: Re: [XOM-interest] A novel approach for writing large XML documents
with XOM


How do this compare to this streaming XOM serializer: http://
dsd.lbl.gov/nux/api/nux/xom/io/StreamingSerializer.html
Wolfgang.

On Oct 22, 2007, at 1:16 AM, Asgeir Frimannsson wrote:

> Hi all,
>
> I wrote a streaming serializer for XOM this weekend, and thought
> perhaps it
> might be useful to someone else, so I'll throw it on the list.
>
> StreamingSerializer is based on the existing Serializer, however,
> it is not
> a subclass of Serializer. It allows for creating very large
> documents and
> writing them to an outputstream. The serializer removes any nodes
> in the
> Document that is out-of-context (already serialized), and thereby
> frees up
> memory.
>
> Central to this serializer is the concept of a 'context node', which
> determines the parent of newly inserted nodes. When inserting
> Elements, the
> new context node is always set to the last descendant Element of
> the element
> being inserted. Rather than inserting children on Elements (using
e.g.
> appendChild) and creating a large in-memory model, use the
> writeNextChild()
> methods of the serializer. Alternatively, create small in-memory
> Element
> trees and use the writeNextChild() method on the Element. Start the
> serialization by calling the write(Document) method. The new
> context is then
> set to the last descendant Element of the root element. After that,
> use the
> public methods of the StreamingSerializer to build your document.
>
> // main api
> class StreamingSerializer{
>
> // sets the new context to the parent context
> ParentNode popContext()
>
> // retrieves the current context node
> ParentNode getContext()
>
> // sets the new context node
> // must be a parent of the current context node
> void setContext(ParentNode node)
>
> // Serializes a document.
> // The context node is set to the last
> // Element descendant of the root element
> void write(Document)
>
> // Serializes an element
> // The context node is set to the last
> // Element descendant of the element
> void writeNextChild(Element)
>
> // serializes nodes as children of
> // the current context node.
> void writeNextChild(Text)
> void writeNextChild(Comment)
> void writeNextChild(ProcessingInstruction)
>
> // completes the serialization of the document
> void finishDocument();
>
> }
>
> An example application:
>
> public static void main(String[] args) throws IOException{
>
> StreamingSerializer serializer = new StreamingSerializer
> (System.out);
> serializer.setIndent(2);
> Element root = new Element("root-element");
> Document doc = new Document(root);
>
> serializer.write(doc);
>
> Element child = new Element("child");
>
> for(int i=0;i<100;i++){ // create a small sub-tree and
> serialize it
> serializer.setContext(root);
>
> Element childX = new Element(child);
> childX.addAttribute(new Attribute("id",String.valueOf(i)));
>
> if(i%7 == 0){
> childX.appendChild("I'm one out of 7!");
> }
> if(i%9 == 0){
> childX.appendChild(new ProcessingInstruction("php","echo
> ('I'm
> one out of 9..');"));
> }
>
> serializer.setContext(root);
> serializer.writeNextChild(childX);
> }
>
> serializer.finishDocument();
> }
>
> StreamingSerializerTest passes most tests from the existing
> SerializerTest,
> except those where subclassing is used in a Serializer-specific
> way (most
> of these are not relevant for StreamingSerializer).
>
> I have written two sample applications:
> - ExampleStreamingWriter - creates an XML document using the
> streaming
> serializer (similar to example).
> - ExampleStreamingIndenter - Streams an XML document through a
> NodeFactory
> and writes it out with the streaming serializer indented...
>
> Some unresolved issues:
> - The Serializer calls removeChildren() on Elements. Element
> subclasses
> might not allow removal of certain nodes, causing this to break..
> - Haven't put much thought into use-cases for Subclassing
> StreamingSerializer, some methods should be declared final for now...
> - Unit tests doesn't cover the new methods
>
> Hope this is useful to someone, and that something similar makes it
> into the
> main XOM library some day. There's definitely a need for a streaming
> serializer in XOM...
>
> I've put the code up here:
> http://camouflage.googlecode.com/files/StreamingSerializer.zip
> Copy the files to the nu.xom source tree, and it should work.
>
> cheers,
> asgeir
> _______________________________________________
> XOM-interest mailing list
> XOM-interest AT lists.ibiblio.org
> http://lists.ibiblio.org/mailman/listinfo/xom-interest

_______________________________________________
XOM-interest mailing list
XOM-interest AT lists.ibiblio.org
http://lists.ibiblio.org/mailman/listinfo/xom-interest




__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com




Archive powered by MHonArc 2.6.24.

Top of Page