2016-06-06 4 views
4

Ich debugge den folgenden Code eines größeren Systems, das nicht von mir geschrieben wird. Es gibt XML, das von einem Server über AJAX kommt, das nicht richtig geparst wird. Im Folgenden wird das Problem erläutert.Internet Explorer XML-Parsing falsch bei Hypen und kann keine Repro Beispiel machen

Beachten Sie die Bindestriche - der Internet Explorer fügt sie ein, wenn es einen in einem CDATA-Teil gibt.

enter image description here

Wenn ich

zum Beispiel drucken
console.log(a.item(4).childNodes.item(0)); 

ich

`{"INCD":"30362790021","sycd":"BKJ2` 

das Problem zu debuggen, ich versuche, ein minimales Beispiel zu erstellen.

habe ich die Variable source kopiert (durch einen Haltepunkt mit der Bedingung Einstellung .ocmmand == ‚List_detail‘) auf eine einfache Datei HTML Javascript wie folgt:

<script> 

    var source = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE primrose SYSTEM \"dtd/primrose.dtd\">\n<primrose><array type=\"string\"> .... </primrose>"; 

    var xml = new DOMParser().parseFromString(source, 'text/xml'); 
    var a = xml.documentElement.childNodes; 
    console.log(a); 
    console.log(a.item(4).childNodes.item(0)); 
</script> 

Das Beispiel in voller Länge bei http://pastebin.com/GaHdjiWW ist

Aber das scheint ganz gut zu funktionieren:

enter image description here

Wenn ich console.log(a.item(4).childNodes.item(0)); laufen bekomme ich

{"INCD":"30362790021","sycd":"BKJ2-2","type_code":"00000050555","type_name":"BKJ","series_code":"110302280810","web_product_id":"10302280810","series_name":"Cross Recessed Pan Head Screws","disp_brandName":"MISUMI","brd_code":"MSM1","ecal_brd_code":"MSM","main_photo":"MSM1/PHOTO/10302280810.jpg","catch_copy":null,"cad_2d":"1","cad_2d_type":"1","cad_3d":"1","cad_3d_type":"2","scene7_img_product":[{"img_fileName":"110302280810_20149999_m_01_99999_jp","img_description":""}],"ary_displayLink":null,"ary_param_verify":"BKJ{2}\t{2}","ary_param_disp":"BKJ{2}\t{2}","param_conv_bef":null,"param_conv_bef_disp":null,"canOrder":"1"}

und so weiter ...

Internet Explorer Version ist 11.0.9600.18314

ich IE10, 11 CDATA with hyphens parsed wrong weiß und es scheint irgendwie ein Fehler zu sein, in IE. Aber warum kann ich es nicht im selben Browser reproduzieren?

+0

Vielleicht gibt es ein seltsames UTF-8-Zeichen? – PiTheNumber

Antwort

3

ich es mit MutationObserver.observe mit childlist und subtree Optionen aufgespürt: https://github.com/talee/mutationobserver-breaks-characterdata. Problemumgehung: Verwenden Sie veraltete MutationEvents in IE < Edge. https://www.npmjs.com/package/mutationobserver-polyfill macht den Job für IE 11.

Bruchcode:

var observer = new MutationObserver(function() {}); 
// Other mutation types/combos work fine 
observer.observe(document, { 
    childList: true, 
    subtree: true 
}); 

Test:

var parser = new DOMParser(); 
var expectedContent = 'hello-world'; 
// <div>hello-world</div> breaks too. Using CDATA as that's my current use 
// case. 
var xml = parser.parseFromString('<div><![CDATA[' + expectedContent + ']]></div>','text/xml'); 
var result = xml.firstChild.firstChild.data; 

// Output test results for viewing 
if (result != expectedContent) { 
    statusOut.textContent = 'FAIL'; 
} else { 
    statusOut.textContent = 'SUCCESS'; 
} 
resultOut.textContent = 'Result: "' + result + '"'; 

ich für IE 11 auf https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8589859/ einen Fehler erstellt.

jedoch basierend auf https://connect.microsoft.com/IE/feedback/details/1398926/ie11-does-not-parse-cdata-containing-hyphens-correctly, ist es unwahrscheinlich, dass das Problem behoben werden, wie es im Zusammenhang nicht Sicherheit ist:

Geschrieben von Brad [MSFT] auf 2016.02.17 um 12:02 Uhr

I sehen. Danke für die Repro. Ich bin in der Lage, IE 11.29.10586.0 zu repro zu verwenden. Leider arbeiten wir nicht mehr IE Bugs, außer sie sind sicherheitsrelevant. Entschuldigung , der Überbringer schlechter Nachrichten zu sein. Ich werde die Rückmeldung in ihrem aktuellen Zustand belassen, da sie nicht für Edge gilt.

+0

Awesome Sie reproduziert dies! – Alex