Removendo caracteres inválidos do XML antes de serializá-lo com XMLSerializer ()

Eu estou tentando armazenar entrada de usuário em um documento XML no lado do cliente (javascript) e transmiti-lo para o servidor para persistência.

Um usuário, por exemplo, colado no texto que incluía um caractere STX (0x2). O XMLSerializer não escapou do caractere STX e, portanto, não serializou para XML bem formado. Ou talvez a chamada .attr () tenha escapado do caractere STX, mas, em ambos os casos, foi produzido um XML inválido.

Eu estou achando que a saída do XMLSerializer () do navegador não é sempre bem-formada (e nem sequer satisfaz o próprio DOMParser () do navegador

Este exemplo mostra que o caractere STX não está corretamente codificado pelo XMLSerializer ():

> doc = $.parseXML('<?xml version="1.0" encoding="utf-8" ?>\n<elem></elem>');
    #document
> $(doc).find("elem").attr("someattr", String.fromCharCode(0x2));
    [ <elem someattr=​"">​</elem>​ ]
> serializedDoc = new XMLSerializer().serializeToString(doc);
    "<?xml version="1.0" encoding="utf-8"?><elem someattr=""/></elem>"
> $.parseXML(serializedDoc);
    Error: Invalid XML: <?xml version="1.0" encoding="utf-8"?><elem someattr=""/></elem>

Como devo construir um documento XML no navegador (com parâmetros determinados pela entrada arbitrária do usuário), de modo que ele sempre seja bem formado (tudo escapou corretamente)? Eu não preciso de suporte a IE8 ou IE7.

(E sim, eu valido o XML no lado do servidor, mas se o navegador entregar ao servidor um documento que não é bem formado, o melhor que o servidor pode fazer é rejeitá-lo, o que não é útil para o usuário pobre )

questionAnswers(1)

yourAnswerToTheQuestion