Skip to content

Commit

Permalink
Add attributes support for U.toXml(map).
Browse files Browse the repository at this point in the history
  • Loading branch information
javadev authored Aug 15, 2018
1 parent 0ed2386 commit 333c628
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 5 deletions.
47 changes: 42 additions & 5 deletions src/main/java/com/github/underscore/lodash/U.java
Original file line number Diff line number Diff line change
Expand Up @@ -1745,6 +1745,8 @@ public static String toJson(Map map) {
public static class XmlStringBuilder {
protected final StringBuilder builder;
private int ident;
private int saveAttrPosition;
private int saveTextPosition;

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

public XmlStringBuilder append(final String string) {
if (">".equals(string)) {
saveAttrPosition = builder.length();
saveTextPosition = builder.length() + 1;
}
builder.append(string);
return this;
}

public XmlStringBuilder insert(final String key, final String value) {
builder.insert(saveAttrPosition, " " + key + "=\"");
saveAttrPosition += (" " + key + "=\"").length();
saveTextPosition += (" " + key + "=\"").length();
builder.insert(saveAttrPosition, value + "\"");
saveAttrPosition += (value + "\"").length();
saveTextPosition += (value + "\"").length();
return this;
}

public XmlStringBuilder insert(final String value) {
builder.delete(saveTextPosition, saveTextPosition + 1);
builder.insert(saveTextPosition, value);
saveTextPosition += value.length();
saveAttrPosition += value.length();
return this;
}

public XmlStringBuilder fillSpaces() {
for (int index = 0; index < ident; index += 1) {
builder.append(' ');
Expand Down Expand Up @@ -1985,13 +2009,26 @@ public static void writeXml(Map map, XmlStringBuilder builder) {
}

Iterator iter = map.entrySet().iterator();
boolean textWasInserted = false;
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
builder.fillSpaces().append("<").append(escape(String.valueOf(entry.getKey()))).append(">");
XmlValue.writeXml(entry.getValue(), builder);
builder.append("</").append(escape(String.valueOf(entry.getKey()))).append(">");
if (iter.hasNext()) {
builder.newLine();
if (escape(String.valueOf(entry.getKey())).startsWith("-") && entry.getValue() instanceof String) {
builder.insert(escape(String.valueOf(entry.getKey())).substring(1), escape((String) entry.getValue()));
} else if ("#text".equals(escape(String.valueOf(entry.getKey())))) {
builder.insert(escape((String) entry.getValue()));
textWasInserted = true;
} else {
if (textWasInserted) {
textWasInserted = false;
} else {
builder.fillSpaces();
}
builder.append("<").append(escape(String.valueOf(entry.getKey()))).append(">");
XmlValue.writeXml(entry.getValue(), builder);
builder.append("</").append(escape(String.valueOf(entry.getKey()))).append(">");
if (iter.hasNext()) {
builder.newLine();
}
}
}
}
Expand Down
47 changes: 47 additions & 0 deletions src/test/java/com/github/underscore/lodash/StringTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1371,6 +1371,53 @@ public void toXmlFromJson() {
U.toXml((Map<String, Object>) U.fromJson(json)));
}

@SuppressWarnings("unchecked")
@Test
public void toXmlFromJson2() {
final String json = "{\n"
+ " \"widget\": {\n"
+ " \"debug\": \"on\",\n"
+ " \"window\": {\n"
+ " \"-title\": \"Sample Konfabulator Widget\",\n"
+ " \"#text\": \"\\n I just put some text here\\n \",\n"
+ " \"name\": \"main_window\",\n"
+ " \"width\": \"500\",\n"
+ " \"height\": \"500\"\n"
+ " },\n"
+ " \"image\": {\n"
+ " \"-name\": \"sun1\",\n"
+ " \"-src\": \"Images\\/Sun.png\",\n"
+ " \"-test\": [],\n"
+ " \"hOffset\": {\n"
+ " \"#text\": \"250\",\n"
+ " \"unit\": \"mm\"\n"
+ " },\n"
+ " \"vOffset\": \"250\",\n"
+ " \"alignment\": \"center\"\n"
+ " }\n"
+ " }\n"
+ "}";
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+ "<widget>\n"
+ " <debug>on</debug>\n"
+ " <window title=\"Sample Konfabulator Widget\">\n"
+ " I just put some text here\n"
+ " <name>main_window</name>\n"
+ " <width>500</width>\n"
+ " <height>500</height>\n"
+ " </window>\n"
+ " <image name=\"sun1\" src=\"Images/Sun.png\">\n"
+ " <-test>\n\n"
+ " </-test>\n"
+ " <hOffset>250<unit>mm</unit>\n"
+ " </hOffset>\n"
+ " <vOffset>250</vOffset>\n"
+ " <alignment>center</alignment>\n"
+ " </image>\n"
+ "</widget>",
U.toXml((Map<String, Object>) U.fromJson(json)));
}

@SuppressWarnings("unchecked")
@Test
public void toXml() {
Expand Down

0 comments on commit 333c628

Please sign in to comment.