[XOM-interest] A novel approach for writing large XML documents with XOM
Wolfgang Hoschek
wolfgang.hoschek at mac.com
Mon Oct 22 12:52:11 EDT 2007
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
More information about the XOM-interest
mailing list