3

TAB、改行、キャリッジ リターンなどの特殊文字を属性値としてシリアル化するときに問題が発生しました。

このhttp://www.w3.org/TR/1999/WD-xml-c14n-19991109.html#charescapingによると、これらはそれぞれ&\#x9;&\#xA;、としてエンコードする必要があり&\#xD;ます。しかし、クロムで呼び出す:

var root = new DOMParser().parseFromString('<root></root>', 'text/xml').documentElement;
root.setAttribute('a', 'first\nsecond');
var serialized = new XMLSerializer().serializeToString(root);

< root a="first\nsecond"/>改行をエスケープしない文字列を返します。

それを再度ロードするとき:

var loaded = new DOMParser().parseFromString(serialized, 'text/xml').documentElement;
loaded.getAttribute('a');

「最初の秒」を返し、改行はスペースだけに失われました。以前にこの問題に直面した人はいますか? どんな助けでも大歓迎です。

ありがとう、

ビクター

4

1 に答える 1

0

私はこの問題に遭遇し、XML ツリーで (nodeValues から) 無効な文字を削除する関数removeInvalidCharacters(xmlNode)を作成して解決しました。シリアル化する前に使用して、無効な文字を取得しないようにすることができます。

同じトピックに関するスタックオーバーフローの質問で removeInvalidCharacters() を見つけることができます

次のように removeInvalidCharacters() を使用できます。

var stringWithSTX = "Bad" + String.fromCharCode(2) + "News";
var xmlNode = $("<myelem/>").attr("badattr", stringWithSTX);

var serializer = new XMLSerializer();
var invalidXML = serializer.serializeToString(xmlNode);

// Now cleanse it:
removeInvalidCharacters(xmlNode);
var validXML = serializer.serializeToString(xmlNode);

私は chrome に対するイシュー レポートも提出しましたが、IE9 にはこの部門に独自のバグがあるため、回避策を伴う修正にはおそらく長い時間がかかることは注目に値します。

于 2013-02-11T15:41:30.300 に答える