Ho il seguente minimo frammento di JavaScript:Chrome 22 uscite XML non valida quando gli attributi hanno un namespace XLink
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/1999/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Quando eseguo il codice nella maggior parte dei browser (basta incollarlo in console JavaScript del browser), l'XML parsed-then-serialized è equivalente all'originale. Per esempio su Chrome 8 ottengo:
<El xmlns:a="http://www.w3.org/1999/xlink" a:title="T" a:href="H"/>
Tuttavia su Chrome 22 lo stesso frammento di codice cambia il XML:
<El xmlns:a="http://www.w3.org/1999/xlink" xlink:title="T" xlink:href="H"/>
Nota che il prefisso namespace xlink
utilizzato dal titolo e href attributi non è definito ovunque, quindi l'XML non è più valido. Come probabilmente puoi immaginare, questo causa tutti i tipi di problemi per il codice che tenta di utilizzare successivamente l'XML.
Si tratta di un bug in XMLSerializer o mi mancano alcune complessità su come il DOM deve essere serializzato?
Inoltre, qualcuno ha trovato una soluzione alternativa che è possibile inserire nel codice, al contrario di fare in modo che XML corrisponda alla preferenza apparente di utilizzare xlink
come prefisso per lo spazio dei nomi XLink?
Aggiornamento
Ho fatto qualche test aggiuntivi e il problema sembra essere causato dal fatto che il XMLSerializer riconosce il namespace XLink e insiste su un output xlink
prefisso per esso, senza registrarti correttamente quel prefisso.
Quindi questo lavoro frammento di bene:
var xml = '<El a:title="T" a:href="H" xmlns:a="any-other-namespace-uri" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Così qui ho cambiato l'URL Namespace a qualcosa di meno conosciuto e l'uscita è ora valida:
Il seguente frammento funziona anche bene :
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/2000/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
Quindi, in questo caso si usa il prefisso "atteso" per lo spazio dei nomi e XLink quindi serializza senza problemi:
<El xmlns:a="http://www.w3.org/2000/xlink" a:title="T" a:href="H"/>
Non sono del tutto sicuro di quale sia la risposta, ma questo problema potrebbe essere correlato: http://stackoverflow.com/questions/8979267/xmlserializer-strips-xlink-from-xlinkhtml-svg-image-tag – Barbarrosa
Grazie per il puntatore Barbarrosa. Ho visto rapporti sulla gestione SVG/XLink di Chrome. Ma temo davvero che la "correzione" di quello possa essere stato ciò che ha causato il problema che sto vivendo. Con il tuo link potrei effettivamente avvicinarmi di un passo al codice offensivo, quindi grazie! –