FasterXML / FasterXML/jackson-dataformat-xml

Serializing `Map`s will produce non-well-formed XML as keys are not modified as per XML name rules

Open
#244 11 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
631
Forks
246
Avg merge
7d 9h
Merged PRs (30d)
13

Description

Hello,
I can not parse Map to valid XML String if Map contains a key with white space.
I am using `jackson-dataformat-xml version: 2.5.3`

Here is sample code to reproduce this issue:

```

package com.asite.html;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class Test {
public static void main(String[] args) throws IOException{
parseMapWithNoSpace(); //This method works fine
parseMapWithSpace(); //This method will throw IOException
}
private static void parseMapWithNoSpace() throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
Map mapWithNoSpace = new HashMap<>();
mapWithNoSpace.put("mapWithNoSpace", "test test"); //Key with no space
XmlMapper mapper = new XmlMapper();
String xml = mapper.writeValueAsString(mapWithNoSpace);
System.out.println(xml);
Map map1 = mapper.readValue(xml, Map.class);
System.out.println(map1);
}

private static void parseMapWithSpace() throws JsonProcessingException, IOException, JsonParseException, JsonMappingException {
Map mapWithSpace = new HashMap<>();
mapWithSpace.put("tests pace", "test"); //key with space
XmlMapper mapper = new XmlMapper();
String xml = mapper.writeValueAsString(mapWithSpace);
System.out.println(xml);
Map map1 = mapper.readValue(xml, Map.class);
System.out.println(map1);
}
}

```

Here is console output
```

test test
{mapWithNoSpace=test test}
test
Exception in thread "main" java.io.IOException: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,30]
Message: Attribute name "space" associated with an element type "test" must be followed by the ' = ' character.
at com.fasterxml.jackson.dataformat.xml.util.StaxUtil.throwXmlAsIOException(StaxUtil.java:24)
at com.fasterxml.jackson.dataformat.xml.deser.XmlTokenStream.next(XmlTokenStream.java:164)
at com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser.nextToken(FromXmlParser.java:453)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer._readAndBindStringMap(MapDeserializer.java:461)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:342)
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3562)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2578)
at com.asite.html.Test.parseMapWithSpace(Test.java:33)
at com.asite.html.Test.main(Test.java:15)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,30]
Message: Attribute name "space" associated with an element type "test" must be followed by the ' = ' character.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:601)
at javax.xml.stream.util.StreamReaderDelegate.next(StreamReaderDelegate.java:88)
at org.codehaus.stax2.ri.Stax2ReaderAdapter.next(Stax2ReaderAdapter.java:129)
at com.fasterxml.jackson.dataformat.xml.deser.XmlTokenStream._collectUntilTag(XmlTokenStream.java:349)
at com.fasterxml.jackson.dataformat.xml.deser.XmlTokenStream._next(XmlTokenStream.java:312)
at com.fasterxml.jackson.dataformat.xml.deser.XmlTokenStream.next(XmlTokenStream.java:162)
... 8 more

```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.