From d78b728151403c338581f8d1ca686b4370bdc2d0 Mon Sep 17 00:00:00 2001 From: Bart Schuller Date: Fri, 21 Nov 2014 13:21:01 +0100 Subject: [PATCH] Fix PIs appearing before text nodes. The SAX handler that's used when you call loadXML didn't append the text buffer to the current node list before pushing a processing-instruction node. --- .../scala/xml/parsing/FactoryAdapter.scala | 1 + .../scala/xml/parsing/PiParsingTest.scala | 53 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/test/scala/scala/xml/parsing/PiParsingTest.scala diff --git a/src/main/scala/scala/xml/parsing/FactoryAdapter.scala b/src/main/scala/scala/xml/parsing/FactoryAdapter.scala index ba57434ab..c0d82dbda 100644 --- a/src/main/scala/scala/xml/parsing/FactoryAdapter.scala +++ b/src/main/scala/scala/xml/parsing/FactoryAdapter.scala @@ -189,6 +189,7 @@ abstract class FactoryAdapter extends DefaultHandler with factory.XMLLoader[Node * Processing instruction. */ override def processingInstruction(target: String, data: String) { + captureText() hStack pushAll createProcInstr(target, data) } } diff --git a/src/test/scala/scala/xml/parsing/PiParsingTest.scala b/src/test/scala/scala/xml/parsing/PiParsingTest.scala new file mode 100644 index 000000000..e9769d374 --- /dev/null +++ b/src/test/scala/scala/xml/parsing/PiParsingTest.scala @@ -0,0 +1,53 @@ +package scala.xml.parsing + +import org.junit.Test +import org.junit.Ignore +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import scala.xml.JUnitAssertsForXML.assertEquals + +class PiParsingTest { + + + import scala.io.Source.fromString + import scala.xml.parsing.ConstructingParser.fromSource + import scala.xml.TopScope + private def parse(s:String) = fromSource(fromString(s), preserveWS = true).element(TopScope) + private def parseNoWS(s:String) = fromSource(fromString(s), preserveWS = false).element(TopScope) + + @Test + def piNoWSparse: Unit = { + val expected = "ab" + assertEquals(expected, parseNoWS("ab")) + } + + @Test + def piNoWSLiteral: Unit = { + val expected = "ab" + assertEquals(expected, ab) + } + + @Test + def piNoWSloadString: Unit = { + val expected = "ab" + assertEquals(expected, xml.XML.loadString("ab")) + } + + @Test + def piParse: Unit = { + val expected = " a b " + assertEquals(expected, parse(" a b ")) + } + + @Test + def piLoadString: Unit = { + val expected = " a b " + assertEquals(expected, xml.XML.loadString(" a b ")) + } + @Test + def piLiteral: Unit = { + val expected = " a b " + assertEquals(expected, a b ) + } + +}