Browse Source

StaxStreamXMLReader ignores significant whitespace

The StaxStreamXMLReader no longer handles all whitespace as ignorable
whitespace.

Issue: SPR-12000
pull/593/head
Arjen Poutsma 12 years ago
parent
commit
d6950d8add
  1. 7
      spring-core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java
  2. 28
      spring-core/src/test/java/org/springframework/util/xml/AbstractStaxXMLReaderTestCase.java
  3. 2
      spring-core/src/test/resources/org/springframework/util/xml/testContentHandler.xml

7
spring-core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2013 the original author or authors. * Copyright 2002-2014 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -217,11 +217,6 @@ class StaxStreamXMLReader extends AbstractStaxXMLReader {
} }
private void handleCharacters() throws SAXException { private void handleCharacters() throws SAXException {
if (getContentHandler() != null && this.reader.isWhiteSpace()) {
getContentHandler().ignorableWhitespace(this.reader.getTextCharacters(),
this.reader.getTextStart(), this.reader.getTextLength());
return;
}
if (XMLStreamConstants.CDATA == this.reader.getEventType() && getLexicalHandler() != null) { if (XMLStreamConstants.CDATA == this.reader.getEventType() && getLexicalHandler() != null) {
getLexicalHandler().startCDATA(); getLexicalHandler().startCDATA();
} }

28
spring-core/src/test/java/org/springframework/util/xml/AbstractStaxXMLReaderTestCase.java

@ -16,15 +16,22 @@
package org.springframework.util.xml; package org.springframework.util.xml;
import java.io.ByteArrayInputStream;
import java.io.InputStream; import java.io.InputStream;
import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXSource;
import static org.junit.Assert.assertEquals;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import static org.mockito.BDDMockito.*; import static org.mockito.BDDMockito.*;
import org.mockito.invocation.InvocationOnMock; import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.w3c.dom.Node;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler; import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
@ -103,6 +110,25 @@ public abstract class AbstractStaxXMLReaderTestCase {
verifyIdenticalInvocations(standardContentHandler, contentHandler); verifyIdenticalInvocations(standardContentHandler, contentHandler);
} }
@Test
public void whitespace() throws Exception {
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><test><node1> </node1><node2> Some text </node2></test>";
Transformer transformer = TransformerFactory.newInstance().newTransformer();
AbstractStaxXMLReader staxXmlReader = createStaxXmlReader(
new ByteArrayInputStream(xml.getBytes("UTF-8")));
SAXSource source = new SAXSource(staxXmlReader, new InputSource());
DOMResult result = new DOMResult();
transformer.transform(source, result);
Node node1 = result.getNode().getFirstChild().getFirstChild();
assertEquals(" ", node1.getTextContent());
assertEquals(" Some text ", node1.getNextSibling().getTextContent());
}
@Test @Test
public void lexicalHandler() throws Exception { public void lexicalHandler() throws Exception {
Resource testLexicalHandlerXml = new ClassPathResource("testLexicalHandler.xml", getClass()); Resource testLexicalHandlerXml = new ClassPathResource("testLexicalHandler.xml", getClass());
@ -130,7 +156,7 @@ public abstract class AbstractStaxXMLReaderTestCase {
verifyIdenticalInvocations(expectedLexicalHandler, actualLexicalHandler); verifyIdenticalInvocations(expectedLexicalHandler, actualLexicalHandler);
} }
private final LexicalHandler mockLexicalHandler() throws Exception { private LexicalHandler mockLexicalHandler() throws Exception {
LexicalHandler lexicalHandler = mock(LexicalHandler.class); LexicalHandler lexicalHandler = mock(LexicalHandler.class);
willAnswer(new CopyCharsAnswer()).given(lexicalHandler).comment(any(char[].class), anyInt(), anyInt()); willAnswer(new CopyCharsAnswer()).given(lexicalHandler).comment(any(char[].class), anyInt(), anyInt());
return lexicalHandler; return lexicalHandler;

2
spring-core/src/test/resources/org/springframework/util/xml/testContentHandler.xml

@ -1,2 +1,2 @@
<h:hello xmlns:h="http://www.greeting.com/hello/" id="a1" h:person="David"><prefix:goodbye <h:hello xmlns:h="http://www.greeting.com/hello/" id="a1" h:person="David"><prefix:goodbye
xmlns:prefix="http://www.greeting.com/goodbye/" h:person="Arjen"/></h:hello> xmlns:prefix="http://www.greeting.com/goodbye/" h:person="Arjen"> Some text </prefix:goodbye><h:so-long> </h:so-long></h:hello>
Loading…
Cancel
Save