Skip to content

Commit 333c628

Browse files
authored
Add attributes support for U.toXml(map).
1 parent 0ed2386 commit 333c628

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

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

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,8 @@ public static String toJson(Map map) {
17451745
public static class XmlStringBuilder {
17461746
protected final StringBuilder builder;
17471747
private int ident;
1748+
private int saveAttrPosition;
1749+
private int saveTextPosition;
17481750

17491751
public XmlStringBuilder() {
17501752
builder = new StringBuilder("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n");
@@ -1757,10 +1759,32 @@ public XmlStringBuilder(StringBuilder builder, int ident) {
17571759
}
17581760

17591761
public XmlStringBuilder append(final String string) {
1762+
if (">".equals(string)) {
1763+
saveAttrPosition = builder.length();
1764+
saveTextPosition = builder.length() + 1;
1765+
}
17601766
builder.append(string);
17611767
return this;
17621768
}
17631769

1770+
public XmlStringBuilder insert(final String key, final String value) {
1771+
builder.insert(saveAttrPosition, " " + key + "=\"");
1772+
saveAttrPosition += (" " + key + "=\"").length();
1773+
saveTextPosition += (" " + key + "=\"").length();
1774+
builder.insert(saveAttrPosition, value + "\"");
1775+
saveAttrPosition += (value + "\"").length();
1776+
saveTextPosition += (value + "\"").length();
1777+
return this;
1778+
}
1779+
1780+
public XmlStringBuilder insert(final String value) {
1781+
builder.delete(saveTextPosition, saveTextPosition + 1);
1782+
builder.insert(saveTextPosition, value);
1783+
saveTextPosition += value.length();
1784+
saveAttrPosition += value.length();
1785+
return this;
1786+
}
1787+
17641788
public XmlStringBuilder fillSpaces() {
17651789
for (int index = 0; index < ident; index += 1) {
17661790
builder.append(' ');
@@ -1985,13 +2009,26 @@ public static void writeXml(Map map, XmlStringBuilder builder) {
19852009
}
19862010

19872011
Iterator iter = map.entrySet().iterator();
2012+
boolean textWasInserted = false;
19882013
while (iter.hasNext()) {
19892014
Map.Entry entry = (Map.Entry) iter.next();
1990-
builder.fillSpaces().append("<").append(escape(String.valueOf(entry.getKey()))).append(">");
1991-
XmlValue.writeXml(entry.getValue(), builder);
1992-
builder.append("</").append(escape(String.valueOf(entry.getKey()))).append(">");
1993-
if (iter.hasNext()) {
1994-
builder.newLine();
2015+
if (escape(String.valueOf(entry.getKey())).startsWith("-") && entry.getValue() instanceof String) {
2016+
builder.insert(escape(String.valueOf(entry.getKey())).substring(1), escape((String) entry.getValue()));
2017+
} else if ("#text".equals(escape(String.valueOf(entry.getKey())))) {
2018+
builder.insert(escape((String) entry.getValue()));
2019+
textWasInserted = true;
2020+
} else {
2021+
if (textWasInserted) {
2022+
textWasInserted = false;
2023+
} else {
2024+
builder.fillSpaces();
2025+
}
2026+
builder.append("<").append(escape(String.valueOf(entry.getKey()))).append(">");
2027+
XmlValue.writeXml(entry.getValue(), builder);
2028+
builder.append("</").append(escape(String.valueOf(entry.getKey()))).append(">");
2029+
if (iter.hasNext()) {
2030+
builder.newLine();
2031+
}
19952032
}
19962033
}
19972034
}

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

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,6 +1371,53 @@ public void toXmlFromJson() {
13711371
U.toXml((Map<String, Object>) U.fromJson(json)));
13721372
}
13731373

1374+
@SuppressWarnings("unchecked")
1375+
@Test
1376+
public void toXmlFromJson2() {
1377+
final String json = "{\n"
1378+
+ " \"widget\": {\n"
1379+
+ " \"debug\": \"on\",\n"
1380+
+ " \"window\": {\n"
1381+
+ " \"-title\": \"Sample Konfabulator Widget\",\n"
1382+
+ " \"#text\": \"\\n I just put some text here\\n \",\n"
1383+
+ " \"name\": \"main_window\",\n"
1384+
+ " \"width\": \"500\",\n"
1385+
+ " \"height\": \"500\"\n"
1386+
+ " },\n"
1387+
+ " \"image\": {\n"
1388+
+ " \"-name\": \"sun1\",\n"
1389+
+ " \"-src\": \"Images\\/Sun.png\",\n"
1390+
+ " \"-test\": [],\n"
1391+
+ " \"hOffset\": {\n"
1392+
+ " \"#text\": \"250\",\n"
1393+
+ " \"unit\": \"mm\"\n"
1394+
+ " },\n"
1395+
+ " \"vOffset\": \"250\",\n"
1396+
+ " \"alignment\": \"center\"\n"
1397+
+ " }\n"
1398+
+ " }\n"
1399+
+ "}";
1400+
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
1401+
+ "<widget>\n"
1402+
+ " <debug>on</debug>\n"
1403+
+ " <window title=\"Sample Konfabulator Widget\">\n"
1404+
+ " I just put some text here\n"
1405+
+ " <name>main_window</name>\n"
1406+
+ " <width>500</width>\n"
1407+
+ " <height>500</height>\n"
1408+
+ " </window>\n"
1409+
+ " <image name=\"sun1\" src=\"Images/Sun.png\">\n"
1410+
+ " <-test>\n\n"
1411+
+ " </-test>\n"
1412+
+ " <hOffset>250<unit>mm</unit>\n"
1413+
+ " </hOffset>\n"
1414+
+ " <vOffset>250</vOffset>\n"
1415+
+ " <alignment>center</alignment>\n"
1416+
+ " </image>\n"
1417+
+ "</widget>",
1418+
U.toXml((Map<String, Object>) U.fromJson(json)));
1419+
}
1420+
13741421
@SuppressWarnings("unchecked")
13751422
@Test
13761423
public void toXml() {

0 commit comments

Comments
 (0)