Skip to content

Commit 792f947

Browse files
authored
MXParser tokenization fails when PI is before first tag (fixes #7) (#12)
1 parent 85fe71e commit 792f947

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

src/main/java/org/codehaus/plexus/util/xml/pull/MXParser.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -1822,13 +1822,9 @@ else if ( ch == '\uFFFD' )
18221822
{
18231823
// check if it is 'xml'
18241824
// deal with XMLDecl
1825-
boolean isXMLDecl = parsePI();
1825+
parsePI();
18261826
if ( tokenize )
18271827
{
1828-
if ( isXMLDecl )
1829-
{
1830-
return eventType = START_DOCUMENT;
1831-
}
18321828
return eventType = PROCESSING_INSTRUCTION;
18331829
}
18341830
}
@@ -3111,7 +3107,7 @@ else if ( ch == '\n' )
31113107
}
31123108
}
31133109

3114-
private boolean parsePI()
3110+
private void parsePI()
31153111
throws XmlPullParserException, IOException
31163112
{
31173113
// implements XML 1.0 Section 2.6 Processing Instructions
@@ -3213,7 +3209,7 @@ else if ( ch == '<' )
32133209
final int off = piTargetStart + 3;
32143210
final int len = pos - 2 - off;
32153211
xmlDeclContent = newString( buf, off, len );
3216-
return false;
3212+
return;
32173213
}
32183214
}
32193215
}
@@ -3291,7 +3287,6 @@ else if ( ch == '\n' )
32913287
--pcEnd;
32923288
}
32933289
}
3294-
return true;
32953290
}
32963291

32973292
// protected final static char[] VERSION = {'v','e','r','s','i','o','n'};

src/test/java/org/codehaus/plexus/util/xml/pull/MXParserTest.java

+42
Original file line numberDiff line numberDiff line change
@@ -1622,4 +1622,46 @@ public void testUnicode() throws IOException {
16221622
fail( "should not raise exception: " + e );
16231623
}
16241624
}
1625+
1626+
@Test
1627+
public void testProcessingInstructionTokenizeBeforeFirstTag()
1628+
throws Exception
1629+
{
1630+
String input = "<?a?><test>nnn</test>";
1631+
1632+
MXParser parser = new MXParser();
1633+
parser.setInput( new StringReader( input ) );
1634+
1635+
assertEquals( XmlPullParser.START_DOCUMENT, parser.getEventType() );
1636+
assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
1637+
assertEquals( "a", parser.getText() );
1638+
assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
1639+
assertEquals( "test", parser.getName() );
1640+
assertEquals( XmlPullParser.TEXT, parser.nextToken() );
1641+
assertEquals( "nnn", parser.getText() );
1642+
assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
1643+
assertEquals( XmlPullParser.END_DOCUMENT, parser.nextToken() );
1644+
}
1645+
1646+
@Test
1647+
public void testProcessingInstructionTokenizeAfterXMLDeclAndBeforeFirstTag()
1648+
throws Exception
1649+
{
1650+
String input = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?a?><test>nnn</test>";
1651+
1652+
MXParser parser = new MXParser();
1653+
parser.setInput( new StringReader( input ) );
1654+
1655+
assertEquals( XmlPullParser.START_DOCUMENT, parser.getEventType() );
1656+
assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
1657+
assertEquals( "xml version=\"1.0\" encoding=\"UTF-8\"", parser.getText() );
1658+
assertEquals( XmlPullParser.PROCESSING_INSTRUCTION, parser.nextToken() );
1659+
assertEquals( "a", parser.getText() );
1660+
assertEquals( XmlPullParser.START_TAG, parser.nextToken() );
1661+
assertEquals( "test", parser.getName() );
1662+
assertEquals( XmlPullParser.TEXT, parser.nextToken() );
1663+
assertEquals( "nnn", parser.getText() );
1664+
assertEquals( XmlPullParser.END_TAG, parser.nextToken() );
1665+
assertEquals( XmlPullParser.END_DOCUMENT, parser.nextToken() );
1666+
}
16251667
}

0 commit comments

Comments
 (0)