diff --git a/basis/xml/tests/cdata.factor b/basis/xml/tests/cdata.factor
new file mode 100644
index 0000000000..ab79679602
--- /dev/null
+++ b/basis/xml/tests/cdata.factor
@@ -0,0 +1,22 @@
+USING: xml xml.writer tools.test ;
+IN: xml.tests
+
+{
+"""
+
+
+ -
+ Python has a n class property in […]
+
+
+"""
+} [
+"""
+
+
+ -
+
+
+
+""" string>xml xml>string
+] unit-test
diff --git a/basis/xml/tokenize/tokenize.factor b/basis/xml/tokenize/tokenize.factor
index a85c48a022..660cbeaf36 100644
--- a/basis/xml/tokenize/tokenize.factor
+++ b/basis/xml/tokenize/tokenize.factor
@@ -92,10 +92,18 @@ HINTS: next* { spot } ;
: string-matcher ( str -- quot: ( pos char -- pos ? ) )
dup length 1 - '[ _ next-matching dup _ > ] ; inline
+:: (take-string) ( match spot -- sbuf matched? )
+ 10 f [
+ spot char>> [
+ nip over push
+ spot next*
+ dup match tail? dup not
+ ] [ f ] if*
+ ] loop ; inline
+
: take-string ( match -- string )
- [ 0 swap string-matcher take-until nip ] keep
- dupd [ length ] bi@ 1 - - head
- get-char [ missing-close ] unless next ;
+ [ spot get (take-string) [ missing-close ] unless ]
+ [ dupd [ length ] bi@ - over shorten "" like ] bi ;
: expect ( string -- )
dup length spot get '[ _ [ char>> ] keep next* ] "" replicate-as