diff --git a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java index 2dfc4c50..ca7c33cc 100644 --- a/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java +++ b/src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java @@ -1822,13 +1822,9 @@ else if ( ch == '\uFFFD' ) { // check if it is 'xml' // deal with XMLDecl - boolean isXMLDecl = parsePI(); + parsePI(); if ( tokenize ) { - if ( isXMLDecl ) - { - return eventType = START_DOCUMENT; - } return eventType = PROCESSING_INSTRUCTION; } } @@ -3111,7 +3107,7 @@ else if ( ch == '\n' ) } } - private boolean parsePI() + private void parsePI() throws XmlPullParserException, IOException { // implements XML 1.0 Section 2.6 Processing Instructions @@ -3213,7 +3209,7 @@ else if ( ch == '<' ) final int off = piTargetStart + 3; final int len = pos - 2 - off; xmlDeclContent = newString( buf, off, len ); - return false; + return; } } } @@ -3291,7 +3287,6 @@ else if ( ch == '\n' ) --pcEnd; } } - return true; } // protected final static char[] VERSION = {'v','e','r','s','i','o','n'}; diff --git a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java index b5c7b908..51df710b 100644 --- a/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java +++ b/src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java @@ -1622,4 +1622,46 @@ public void testUnicode() throws IOException { fail( "should not raise exception: " + e ); } } + + @Test + public void testProcessingInstructionTokenizeBeforeFirstTag() + throws Exception + { + String input = "nnn"; + + MXParser parser = new MXParser(); + parser.setInput( new StringReader( input ) ); + + assertEquals( XmlPullParser.START_DOCUMENT, parser.getEventType() ); + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + assertEquals( "a", parser.getText() ); + assertEquals( XmlPullParser.START_TAG, parser.nextToken() ); + assertEquals( "test", parser.getName() ); + assertEquals( XmlPullParser.TEXT, parser.nextToken() ); + assertEquals( "nnn", parser.getText() ); + assertEquals( XmlPullParser.END_TAG, parser.nextToken() ); + assertEquals( XmlPullParser.END_DOCUMENT, parser.nextToken() ); + } + + @Test + public void testProcessingInstructionTokenizeAfterXMLDeclAndBeforeFirstTag() + throws Exception + { + String input = "nnn"; + + MXParser parser = new MXParser(); + parser.setInput( new StringReader( input ) ); + + assertEquals( XmlPullParser.START_DOCUMENT, parser.getEventType() ); + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + assertEquals( "xml version=\"1.0\" encoding=\"UTF-8\"", parser.getText() ); + assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() ); + assertEquals( "a", parser.getText() ); + assertEquals( XmlPullParser.START_TAG, parser.nextToken() ); + assertEquals( "test", parser.getName() ); + assertEquals( XmlPullParser.TEXT, parser.nextToken() ); + assertEquals( "nnn", parser.getText() ); + assertEquals( XmlPullParser.END_TAG, parser.nextToken() ); + assertEquals( XmlPullParser.END_DOCUMENT, parser.nextToken() ); + } }