diff --git a/pkgs/racket-test/tests/xml/pr2440.rkt b/pkgs/racket-test/tests/xml/pr2440.rkt new file mode 100644 index 0000000000..b81e456076 --- /dev/null +++ b/pkgs/racket-test/tests/xml/pr2440.rkt @@ -0,0 +1,23 @@ +#lang racket/base +(require xml + xml/plist) + +(module+ test + (require rackunit) + + (define example + #< + + + + Genre + Gospel & Religious + + +END + ) + + (check-equal? + (read-plist (open-input-string example)) + '(dict (assoc-pair "Genre" "Gospel & Religious")))) diff --git a/racket/collects/xml/plist.rkt b/racket/collects/xml/plist.rkt index afc1ff5c6c..a1798a6a24 100644 --- a/racket/collects/xml/plist.rkt +++ b/racket/collects/xml/plist.rkt @@ -164,10 +164,20 @@ (cons `(assoc-pair ,(cadr key) ,(collapse-value value)) (collapse-assoc-pairs rest))))) +(define (convert-string-value x) + (cond [(string? x) + x] + [(integer? x) + (string (integer->char x))] + [else + (error 'read-plist "Illegal string value: ~e" x)])) + ; collapse-value : xexpr -> value (define (collapse-value value) (case (car value) - [(string) (cadr value)] + [(string) (apply string-append + (map convert-string-value + (cdr value)))] [(true false) value] [(integer real) (list (car value) (string->number (cadr value)))] [(dict) (collapse-dict value)]