Skip to content

Commit fecfd8d

Browse files
authored
Improve array convert in U.toXml(map).
1 parent f16f494 commit fecfd8d

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

src/main/java/com/github/underscore/lodash/Xml.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,14 @@ private static void addText(final Map.Entry entry, final List<XmlStringBuilder>
429429
private static void addElements(final XmlStringBuilder.Step identStep, final int ident, Map.Entry entry,
430430
Set<String> namespaces, final List<XmlStringBuilder> elems, final boolean addNewLine) {
431431
boolean parentTextFound = !elems.isEmpty() && elems.get(elems.size() - 1) instanceof XmlStringBuilderText;
432-
XmlStringBuilder localBuilder = new XmlStringBuilderWithoutHeader(identStep, ident);
432+
final XmlStringBuilder localBuilder;
433+
if (String.valueOf(((List) entry.getValue()).get(0)).startsWith("{" + TEXT)
434+
|| String.valueOf(((List) entry.getValue()).get(((List) entry.getValue()).size() - 1))
435+
.startsWith("{" + TEXT)) {
436+
localBuilder = new XmlStringBuilderText(identStep, ident);
437+
} else {
438+
localBuilder = new XmlStringBuilderWithoutHeader(identStep, ident);
439+
}
433440
XmlArray.writeXml((List) entry.getValue(), localBuilder,
434441
String.valueOf(entry.getKey()), parentTextFound, namespaces);
435442
if (addNewLine) {
@@ -683,9 +690,17 @@ public static String toXml(Map map, XmlStringBuilder.Step identStep) {
683690
localMap = map;
684691
}
685692
if (localMap == null || localMap.size() != 1
686-
|| ((String) ((Map.Entry) localMap.entrySet().iterator().next()).getKey()).startsWith("-")
693+
|| (String.valueOf(((Map.Entry) localMap.entrySet().iterator().next()).getKey())).startsWith("-")
687694
|| ((Map.Entry) localMap.entrySet().iterator().next()).getValue() instanceof List) {
688-
XmlObject.writeXml(localMap, "root", builder, false, U.<String>newLinkedHashSet());
695+
final String name;
696+
if (localMap != null && localMap.size() == 1
697+
&& ((Map.Entry) localMap.entrySet().iterator().next()).getValue() instanceof List
698+
&& !((List) ((Map.Entry) localMap.entrySet().iterator().next()).getValue()).isEmpty()) {
699+
name = String.valueOf(((Map.Entry) localMap.entrySet().iterator().next()).getKey());
700+
} else {
701+
name = "root";
702+
}
703+
XmlObject.writeXml(localMap, name, builder, false, U.<String>newLinkedHashSet());
689704
} else {
690705
XmlObject.writeXml(localMap, null, builder, false, U.<String>newLinkedHashSet());
691706
}

src/test/java/com/github/underscore/lodash/StringTest.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1941,6 +1941,30 @@ public void toXmlFromJson19() {
19411941
U.toXml((Map<String, Object>) U.fromJson(json2)));
19421942
}
19431943

1944+
@SuppressWarnings("unchecked")
1945+
@Test
1946+
public void toXmlFromJson20() {
1947+
final String json = "{\n"
1948+
+ " \"a\": [\n"
1949+
+ " {\"#text\": \"Hello \"},\n"
1950+
+ " {\"b\": \"World\"}\n"
1951+
+ " ]\n"
1952+
+ "}";
1953+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1954+
+ "<a>Hello <b>World</b></a>", U.toXml((Map<String, Object>) U.fromJson(json)));
1955+
final String json2 = "{\n"
1956+
+ " \"a\": [\n"
1957+
+ " {\"b\": \"World\"},\n"
1958+
+ " {\"#text1\": \".\"}\n"
1959+
+ " ]\n"
1960+
+ "}";
1961+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1962+
+ "<a> <b>World</b>.</a>", U.toXml((Map<String, Object>) U.fromJson(json2)));
1963+
final String json3 = "{\n \"a\": []\n}";
1964+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1965+
+ "<root>\n <a>\n </a>\n</root>", U.toXml((Map<String, Object>) U.fromJson(json3)));
1966+
}
1967+
19441968
@SuppressWarnings("unchecked")
19451969
@Test
19461970
public void toXml() {

0 commit comments

Comments
 (0)