Browse Source

Properly encode control characters. See XML 1.0 2.2

<http://www.w3.org/TR/1998/REC-xml-19980210#charsets>.

Submitted by:	Jim White <jim@pagesmiths.com>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270252 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 23 years ago
parent
commit
a623bba85d
2 changed files with 48 additions and 2 deletions
  1. +45
    -2
      src/main/org/apache/tools/ant/util/DOMElementWriter.java
  2. +3
    -0
      src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java

+ 45
- 2
src/main/org/apache/tools/ant/util/DOMElementWriter.java View File

@@ -142,7 +142,7 @@ public class DOMElementWriter {
case Node.CDATA_SECTION_NODE:
out.write("<![CDATA[");
out.write(((Text)child).getData());
out.write(encodedata(((Text)child).getData()));
out.write("]]>");
break;

@@ -183,7 +183,8 @@ public class DOMElementWriter {
}

/**
* Escape &lt;, &gt; &amp; &apos; and &quot; as their entities.
* Escape &lt;, &gt; &amp; &apos;, &quot; and control characters
* &lt; 0x20 as their entities.
*/
public String encode(String value) {
sb.setLength(0);
@@ -211,9 +212,51 @@ public class DOMElementWriter {
sb.append('&');
}
break;
case '\t':
case '\n':
case '\r':
sb.append(c);
break;
default:
if (c < 0x20) {
sb.append("&#x");
sb.append(Integer.toHexString(c));
sb.append(';');
} else {
sb.append(c);
}
break;
}
}
return sb.toString();
}

/**
* Escape control characters &lt; x20 as their entities.
*
* <p>See XML 1.0 2.2 <a
* href="http://www.w3.org/TR/1998/REC-xml-19980210#charsets">http://www.w3.org/TR/1998/REC-xml-19980210#charsets</a>.</p>
*/
public String encodedata(final String value) {
sb.setLength(0);
for (int i = 0; i < value.length(); ++i) {
char c = value.charAt(i);
switch (c) {
case '\t':
case '\n':
case '\r':
sb.append(c);
break;
default:
if (c < 0x20) {
sb.append("&#x");
sb.append(Integer.toHexString(c));
sb.append(';');
} else {
sb.append(c);
}
break;
}
}
return sb.toString();


+ 3
- 0
src/testcases/org/apache/tools/ant/util/DOMElementWriterTest.java View File

@@ -100,5 +100,8 @@ public class DOMElementWriterTest extends TestCase {
assertEquals("&quot;", w.encode("\""));
assertEquals("&lt;", w.encode("<"));
assertEquals("&amp;", w.encode("&"));
assertEquals("&#x17;", w.encode("\u0017"));
assertEquals("&#20;\"20;&", w.encodedata("&#20;\"20;&"));
assertEquals("&#x17;", w.encodedata("\u0017"));
}
}

Loading…
Cancel
Save