diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxEventXMLReader.java b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxEventXMLReader.java index 48f64e190ac..af667773cb3 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxEventXMLReader.java +++ b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxEventXMLReader.java @@ -57,8 +57,14 @@ import org.springframework.util.StringUtils; */ class StaxEventXMLReader extends AbstractStaxXMLReader { + private static final String DEFAULT_XML_VERSION = "1.0"; + private final XMLEventReader reader; + private String xmlVersion = DEFAULT_XML_VERSION; + + private String encoding; + /** * Constructs a new instance of the StaxEventXmlReader that reads from the given * XMLEventReader. The supplied event reader must be in XMLStreamConstants.START_DOCUMENT or @@ -143,6 +149,17 @@ class StaxEventXMLReader extends AbstractStaxXMLReader { } private void handleStartDocument(final XMLEvent event) throws SAXException { + if (event.isStartDocument()) { + StartDocument startDocument = (StartDocument) event; + String xmlVersion = startDocument.getVersion(); + if (StringUtils.hasLength(xmlVersion)) { + this.xmlVersion = xmlVersion; + } + if (startDocument.encodingSet()) { + this.encoding = startDocument.getCharacterEncodingScheme(); + } + } + if (getContentHandler() != null) { final Location location = event.getLocation(); getContentHandler().setDocumentLocator(new Locator2() { @@ -164,22 +181,11 @@ class StaxEventXMLReader extends AbstractStaxXMLReader { } public String getXMLVersion() { - if (event.isStartDocument()) { - StartDocument startDocument = (StartDocument) event; - String version = startDocument.getVersion(); - return StringUtils.hasLength(version) ? version : "1.0"; - } - return null; + return xmlVersion; } public String getEncoding() { - if (event.isStartDocument()) { - StartDocument startDocument = (StartDocument) event; - if (startDocument.encodingSet()) { - return startDocument.getCharacterEncodingScheme(); - } - } - return null; + return encoding; } }); @@ -195,6 +201,19 @@ class StaxEventXMLReader extends AbstractStaxXMLReader { Namespace namespace = (Namespace) i.next(); getContentHandler().startPrefixMapping(namespace.getPrefix(), namespace.getNamespaceURI()); } + for (Iterator i = startElement.getAttributes(); i.hasNext();){ + Attribute attribute = (Attribute) i.next(); + String prefix = attribute.getName().getPrefix(); + if (prefix == null) { + prefix = ""; + } + String namespace = attribute.getName().getNamespaceURI(); + if (namespace == null) { + continue; + } + getContentHandler().startPrefixMapping(prefix, namespace); + } + getContentHandler().startElement(qName.getNamespaceURI(), qName.getLocalPart(), toQualifiedName(qName), getAttributes(startElement)); } diff --git a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java index 39594b157af..1168dd1f044 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java +++ b/org.springframework.core/src/main/java/org/springframework/util/xml/StaxStreamXMLReader.java @@ -43,8 +43,14 @@ import org.springframework.util.StringUtils; */ class StaxStreamXMLReader extends AbstractStaxXMLReader { + private static final String DEFAULT_XML_VERSION = "1.0"; + private final XMLStreamReader reader; + private String xmlVersion = DEFAULT_XML_VERSION; + + private String encoding; + /** * Constructs a new instance of the StaxStreamXmlReader that reads from the given * XMLStreamReader. The supplied stream reader must be in XMLStreamConstants.START_DOCUMENT @@ -123,6 +129,14 @@ class StaxStreamXMLReader extends AbstractStaxXMLReader { } private void handleStartDocument() throws SAXException { + if (XMLStreamConstants.START_DOCUMENT == reader.getEventType()) { + String xmlVersion = reader.getVersion(); + if (StringUtils.hasLength(xmlVersion)) { + this.xmlVersion = xmlVersion; + } + this.encoding = reader.getCharacterEncodingScheme(); + } + if (getContentHandler() != null) { final Location location = reader.getLocation(); @@ -145,12 +159,11 @@ class StaxStreamXMLReader extends AbstractStaxXMLReader { } public String getXMLVersion() { - String version = reader.getVersion(); - return StringUtils.hasLength(version) ? version : "1.0"; + return xmlVersion; } public String getEncoding() { - return reader.getEncoding(); + return encoding; } }); getContentHandler().startDocument(); @@ -171,6 +184,17 @@ class StaxStreamXMLReader extends AbstractStaxXMLReader { } getContentHandler().startPrefixMapping(prefix, reader.getNamespaceURI(i)); } + for (int i = 0; i < reader.getAttributeCount(); i++) { + String prefix = reader.getAttributePrefix(i); + if (prefix == null) { + prefix = ""; + } + String namespace = reader.getAttributeNamespace(i); + if (namespace == null) { + continue; + } + getContentHandler().startPrefixMapping(prefix, namespace); + } getContentHandler().startElement(qName.getNamespaceURI(), qName.getLocalPart(), toQualifiedName(qName), getAttributes()); }