How to stream XML data using XOM?

后端 未结 2 2004
无人及你
无人及你 2021-01-03 06:17

Say I want to output a huge set of search results, as XML, into a PrintWriter or an OutputStream, using XOM. The resulting XML would look like this:



        
相关标签:
2条回答
  • 2021-01-03 06:52

    I ran in to the same issue, but found it's pretty simple to do what you mentioned as an option and subclass Serializer as follows:

    public class StreamSerializer extends Serializer {
    
        public StreamSerializer(OutputStream out) {
            super(out);
        }
    
        @Override
        public void write(Element element) throws IOException {
            super.write(element);
        }
    
        @Override
        public void writeXMLDeclaration() throws IOException {
            super.writeXMLDeclaration();
        }
    
        @Override
        public void writeEndTag(Element element) throws IOException {
            super.writeEndTag(element);
        }
    
        @Override
        public void writeStartTag(Element element) throws IOException {
            super.writeStartTag(element);
        }
    
    }
    

    Then you can still take advantage of the various XOM config like setIdent, etc. but use it like this:

    Element rootElement = new Element("resultset");
    StreamSerializer serializer = new StreamSerializer(out);
    serializer.setIndent(4);
    serializer.writeXMLDeclaration();
    serializer.writeStartTag(rootElement);
    while(hasNextElement()) {
        serializer.write(nextElement());
    }
    serializer.writeEndTag(rootElement);
    serializer.flush();
    
    0 讨论(0)
  • 2021-01-03 07:00

    As far as I know, XOM doesn't support streaming directly.

    What I used when I wanted to stream my XML documents was NUX, which has Streaming XML Serializer, similar to standard Serializer class in XOM. NUX is compatible with XOM. I downloaded NUX sources, extracted few NUX classes (StreamingSerializer interface, StreamingXMLSerializer -- which works for XOM documents, StreamingVerifier and NamespacesInScope), put them into my project, and it works like a charm. Too bad this isn't directly in XOM :-(

    NUX is very nice companion to XOM: http://acs.lbl.gov/software/nux/, working mirror download: nux-1.6.tar.gz

    Link to API: http://acs.lbl.gov/software/nux/api/nux/xom/io/StreamingSerializer.html

    Here is sample code (methods are called in order: start(), n*nextResult(), finish(), serializer is StreamingXMLSerializer from NUX):

    void start() {
        serializer.writeXMLDeclaration();
    
        Element root = new Element("response");
        root.addAttribute(new Attribute("found", Integer.toString(123)));
        root.addAttribute(new Attribute("count", Integer.toString(542)));
    
        serializer.writeStartTag(root);
    
        serializer.flush();
    }
    
    void nextResult(Result result) {
        Element element = result.createXMLRepresentation();
        serializer.write(element);
        serializer.flush();
    }
    
    void finish() {
        serializer.writeEndTag();
        serializer.flush();
    }
    
    0 讨论(0)
提交回复
热议问题