diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlTokenStream.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlTokenStream.java index 9e165e365..6d85076ca 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlTokenStream.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/deser/XmlTokenStream.java @@ -377,40 +377,43 @@ private final String _collectUntilTag() throws XMLStreamException return ""; } - String text = null; + CharSequence chars = null; while (true) { switch (_xmlReader.next()) { - case XMLStreamConstants.START_ELEMENT: - return (text == null) ? "" : text; - - case XMLStreamConstants.END_ELEMENT: - case XMLStreamConstants.END_DOCUMENT: - // 04-May-2018, tatu: For 3.0 we can actually start exposing ALSO - // as `null`, as long as we default `String` null handling to coerce that to - // "empty" - if (text == null) { - if (FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL.enabledIn(_formatFeatures)) { - return null; + case XMLStreamConstants.START_ELEMENT: + return chars == null ? "" : chars.toString(); + + case XMLStreamConstants.END_ELEMENT: + case XMLStreamConstants.END_DOCUMENT: + // 04-May-2018, tatu: For 3.0 we can actually start exposing ALSO + // as `null`, as long as we default `String` null handling to coerce that to + // "empty" + if (chars == null) { + if (FromXmlParser.Feature.EMPTY_ELEMENT_AS_NULL.enabledIn(_formatFeatures)) { + return null; + } + return ""; } - return ""; - } - return text; + return chars.toString(); - // note: SPACE is ignorable (and seldom seen), not to be included - case XMLStreamConstants.CHARACTERS: - case XMLStreamConstants.CDATA: - // 17-Jul-2017, tatu: as per [dataformat-xml#236], need to try to... + // note: SPACE is ignorable (and seldom seen), not to be included + case XMLStreamConstants.CHARACTERS: + case XMLStreamConstants.CDATA: + // 17-Jul-2017, tatu: as per [dataformat-xml#236], need to try to... { String str = _getText(_xmlReader); - if (text == null) { - text = str; - } else { - text += str; + if (chars == null) { + chars = str; + } else { + if (chars instanceof String) { + chars = new StringBuilder(chars); + } + ((StringBuilder)chars).append(str); } } break; - default: - // any other type (proc instr, comment etc) is just ignored + default: + // any other type (proc instr, comment etc) is just ignored } } }