Parsing an XML stream with no root element Parsing an XML stream with no root element xml xml

Parsing an XML stream with no root element


SequenceInputStream comes to the rescue:

    SAXParserFactory saxFactory = SAXParserFactory.newInstance();    SAXParser parser = saxFactory.newSAXParser();    parser.parse(        new SequenceInputStream(            Collections.enumeration(Arrays.asList(            new InputStream[] {                new ByteArrayInputStream("<dummy>".getBytes()),                new FileInputStream(file),//bogus xml                new ByteArrayInputStream("</dummy>".getBytes()),            }))        ),         new DefaultHandler()    );


You can wrap your given Reader in a FilterReader subclass that you implement to do more or less what you're doing here.

Edit:

While this is similar to the proposal to implement your own Reader delegating to the given Reader object given by a couple other answers, just about all methods in FilterReader would have to be overridden, so you may not gain much from using the superclass.

An interesting variation on the other proposals might be to implement a SequencedReader which wraps multiple Reader objects and shifts to the next in the sequence when one is used up. Then you could pass in a StringReader object with the start text for the root you want to add, the original Reader and another StringReader with the closing tag.


You can write your own Reader-Implementation that encapsulates the Reader-instance you're given. This new Reader should do just what you're doing in your example code, provide the header and root element, then the data from the underlying reader and in the end the closing root tag. By going this way you can provide a valid XML stream to the XML parser and you can as well use the Reader object passed to your code.