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() );
+ }
}