Skip to content

Commit 3237688

Browse files
Fix XMLEventReader does not handle ' properly
Fixes #72
1 parent 5f7601a commit 3237688

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

jvm/src/test/scala/scala/xml/pull/XMLEventReaderTest.scala

+36
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,40 @@ class XMLEventReaderTest {
168168
while(er.hasNext) er.next()
169169
er.stop()
170170
}
171+
172+
@Test
173+
def entityRefTest: Unit = {
174+
val source = Source.fromString("<text>&quot;&apos;&lt;&gt;&amp;</text>")
175+
val er = new XMLEventReader(source)
176+
177+
assertTrue(er.next match {
178+
case EvElemStart(_, "text", _, _) => true
179+
case _ => false
180+
})
181+
assertTrue(er.next match {
182+
case EvEntityRef("quot") => true
183+
case e => false
184+
})
185+
assertTrue(er.next match {
186+
case EvEntityRef("apos") => true
187+
case _ => false
188+
})
189+
assertTrue(er.next match {
190+
case EvEntityRef("lt") => true
191+
case _ => false
192+
})
193+
assertTrue(er.next match {
194+
case EvEntityRef("gt") => true
195+
case _ => false
196+
})
197+
assertTrue(er.next match {
198+
case EvEntityRef("amp") => true
199+
case _ => false
200+
})
201+
assertTrue(er.next match {
202+
case EvElemEnd(_, "text") => true
203+
case _ => false
204+
})
205+
assert(er.isEmpty)
206+
}
171207
}

shared/src/main/scala/scala/xml/Utility.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ object Utility extends AnyRef with parsing.TokenTests {
9393
* For reasons unclear escape and unescape are a long ways from
9494
* being logical inverses.
9595
*/
96-
val pairs = Map(
96+
private val pairs = Map(
9797
"lt" -> '<',
9898
"gt" -> '>',
9999
"amp" -> '&',

shared/src/main/scala/scala/xml/parsing/MarkupParser.scala

+7-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ package parsing
1212

1313
import scala.io.Source
1414
import scala.xml.dtd._
15-
import Utility.Escapes.{ pairs => unescape }
15+
import Utility.Escapes.unescMap
1616

1717
/**
1818
* An XML parser.
@@ -470,11 +470,12 @@ trait MarkupParser extends MarkupParserCommon with TokenTests {
470470
case _ => // EntityRef
471471
val n = xName
472472
xToken(';')
473-
474-
if (unescape contains n) {
475-
handle.entityRef(tmppos, n)
476-
ts &+ unescape(n)
477-
} else push(n)
473+
unescMap.get(n) match {
474+
case None => push(n)
475+
case Some(theChar) =>
476+
handle.entityRef(tmppos, n)
477+
ts &+ theChar
478+
}
478479
}
479480
case _ => // text content
480481
appendText(tmppos, ts, xText)

0 commit comments

Comments
 (0)