Browse Source

properly encode whitespace in attribute values

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@958857 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 15 years ago
parent
commit
9b19344ae6
2 changed files with 59 additions and 1 deletions
  1. +25
    -1
      src/main/org/apache/tools/ant/util/DOMElementWriter.java
  2. +34
    -0
      src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java

+ 25
- 1
src/main/org/apache/tools/ant/util/DOMElementWriter.java View File

@@ -332,7 +332,7 @@ public class DOMElementWriter {
}
out.write(attr.getName());
out.write("=\"");
out.write(encode(attr.getValue()));
out.write(encodeAttributeValue(attr.getValue()));
out.write("\"");
}

@@ -411,6 +411,21 @@ public class DOMElementWriter {
* @return the encoded string.
*/
public String encode(String value) {
return encode(value, false);
}

/**
* Escape <, > & ', " as their entities, \n,
* \r and \t as numeric entities and drop characters that are
* illegal in XML documents.
* @param value the string to encode.
* @return the encoded string.
*/
public String encodeAttributeValue(String value) {
return encode(value, true);
}

private String encode(String value, boolean encodeWhitespace) {
int len = value.length();
StringBuffer sb = new StringBuffer(len);
for (int i = 0; i < len; i++) {
@@ -431,6 +446,15 @@ public class DOMElementWriter {
case '&':
sb.append("&amp;");
break;
case '\r':
case '\n':
case '\t':
if (encodeWhitespace) {
sb.append("&#x").append(Integer.toHexString(c)).append(";");
} else {
sb.append(c);
}
break;
default:
if (isLegalCharacter(c)) {
sb.append(c);


+ 34
- 0
src/tests/junit/org/apache/tools/ant/util/DOMElementWriterTest.java View File

@@ -68,6 +68,40 @@ public class DOMElementWriterTest extends TestCase {
assertEquals("&lt;", w.encode("<"));
assertEquals("&amp;", w.encode("&"));
assertEquals("", w.encode("\u0017"));
assertEquals("\r\n\t", w.encode("\r\n\t"));
}

public void testEncodeAttributeValue() {
assertEquals("&amp;#20;", w.encodeAttributeValue("&#20;"));
assertEquals("&amp;#x20;", w.encodeAttributeValue("&#x20;"));
assertEquals("&amp;#xA0;", w.encodeAttributeValue("&#xA0;"));
assertEquals("&amp;#A0;", w.encodeAttributeValue("&#A0;"));
assertEquals("20;", w.encodeAttributeValue("20;"));
assertEquals("&amp;#20", w.encodeAttributeValue("&#20"));
assertEquals("&amp;quot;", w.encodeAttributeValue("&quot;"));
assertEquals("&amp;apos;", w.encodeAttributeValue("&apos;"));
assertEquals("&amp;gt;", w.encodeAttributeValue("&gt;"));
assertEquals("&amp;lt;", w.encodeAttributeValue("&lt;"));
assertEquals("&amp;amp;", w.encodeAttributeValue("&amp;"));
assertEquals("&quot;", w.encodeAttributeValue("\""));
assertEquals("&lt;", w.encodeAttributeValue("<"));
assertEquals("&amp;", w.encodeAttributeValue("&"));
assertEquals("", w.encodeAttributeValue("\u0017"));
assertEquals("&#xd;&#xa;&#x9;", w.encodeAttributeValue("\r\n\t"));
}

public void testAttributeWithWhitespace() throws IOException {
Document d = DOMUtils.newDocument();
Element root = d.createElement("root");
root.setAttribute("foo", "bar\nbaz");
StringWriter sw = new StringWriter();
DOMElementWriter w = new DOMElementWriter();
w.write(root, sw, 0, " ");
assertEquals("<root foo=\"bar&#xa;baz\" />" + StringUtils.LINE_SEP,
sw.toString());
}

public void testEncodeData() {
assertEquals("&#20;\"20;&", w.encodedata("&#20;\"20;&"));
assertEquals("", w.encodedata("\u0017"));
}


Loading…
Cancel
Save