diff --git a/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt b/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt
index 4525d3b499..3b5aac2931 100644
--- a/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt
+++ b/pkgs/racket-pkgs/racket-test/tests/xml/test.rkt
@@ -563,6 +563,9 @@ END
" ")
(test-xexpr->string '(root () 40)
"(")
+ (check-exn
+ exn:fail?
+ (λ () (xexpr->string "\f")))
; XXX more xexpr->string tests
)
diff --git a/racket/collects/xml/private/writer.rkt b/racket/collects/xml/private/writer.rkt
index 3bfc5adf80..bd56c006e8 100644
--- a/racket/collects/xml/private/writer.rkt
+++ b/racket/collects/xml/private/writer.rkt
@@ -154,15 +154,22 @@
(let ([n (entity-text entity)])
(fprintf out (if (number? n) "~a;" "&~a;") n)))
-(define escape-table #rx"[<>&]")
+(define escape-table #px"[<>&[:cntrl:]]")
(define escape-attribute-table #rx"[<>&\"]")
(define (replace-escaped s)
- (case (string-ref s 0)
+ (define c (string-ref s 0))
+ (case c
[(#\<) "<"]
[(#\>) ">"]
[(#\&) "&"]
- [(#\") """]))
+ [(#\") """]
+ [(#\newline) "\n"]
+ [else
+ (define i (char->integer c))
+ (if (valid-char? i)
+ (format "~a;" i)
+ (error 'escape "illegal character, ~v" c))]))
;; escape : String -> String
(define (escape x table)
diff --git a/racket/collects/xml/private/xexpr.rkt b/racket/collects/xml/private/xexpr.rkt
index 5fb458c09d..add87dd5f1 100644
--- a/racket/collects/xml/private/xexpr.rkt
+++ b/racket/collects/xml/private/xexpr.rkt
@@ -60,7 +60,7 @@
(error 'xexpr->xml
"expected a list of xexprs for the body in ~e"
x))
- (make-element 'scheme 'scheme (car x)
+ (make-element 'racket 'racket (car x)
atts
(map xexpr->xml body)))])
(if (and (pair? (cdr x))
@@ -68,9 +68,9 @@
(and (pair? (cadr x)) (pair? (caadr x)))))
(f (map srep->attribute (cadr x)) (cddr x))
(f null (cdr x))))]
- [(string? x) (make-pcdata 'scheme 'scheme x)]
+ [(string? x) (make-pcdata 'racket 'racket x)]
[(or (symbol? x) (exact-nonnegative-integer? x))
- (make-entity 'scheme 'scheme x)]
+ (make-entity 'racket 'racket x)]
[(or (comment? x) (p-i? x) (cdata? x) (pcdata? x)) x]
[else ;(error 'xexpr->xml "malformed xexpr ~e" x)
x]))