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());
}