2012-10-09 19 views
23

varken aşağıdaki minimum JavaScript parçası vardır:Krom 22 çıkışlar geçersiz XML nitelikleri bir Xline ad

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); 

Ben (tıpkı tarayıcınızın JavaScript konsolunda yapıştırın) çoğu tarayıcıda kodu çalıştırmak, ayrıştırılmış-sonra-seri hale getirilmiş XML, orijinaline eşdeğerdir. Chrome 8 Örneğin ben alıyorum: Ancak

<El xmlns:a="http://www.w3.org/1999/xlink" a:title="T" a:href="H"/> 

Chrome 22 aynı kod parçası için XML değiştirir:

<El xmlns:a="http://www.w3.org/1999/xlink" xlink:title="T" xlink:href="H"/> 

Not başlığı ve href özelliklerinin kullandığı ad alanı öneki xlink olmadığını herhangi bir yerde tanımlanmış, bu yüzden XML artık geçersiz. Muhtemelen tahmin edebileceğiniz gibi bu, XML'yi sonradan kullanmaya çalışan kod için her türlü soruna neden olur.

Bu, XMLSerializer'daki bir hata mıdır yoksa DOM'ın nasıl serileştirilmesi gerektiği konusunda bazı incelemeler kaçırıyor muyum?

Ayrıca, XML'in XLink ad alanı öneki olarak xlink kullanmak için görünen tercihle eşleşmesini sağlamak yerine, kod koyabileceğim bir çözüm bulmuş muydunuz?

Güncelleme Bazı ek sınama yaptım ve sorun XMLSerializer Xline ad tanır ve düzgün o öneki kayıt olmadan, bunun için bir xlink öneki çıkışı ısrar gerçeği neden gibi görünüyor.

Yani bu parça eser ince: Yani burada

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); 

daha az tanınmış bir şeye ad alanı URL değişti ve çıkış şimdi geçerlidir:

aşağıdaki parçası da gayet iyi çalışıyor :

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); 

Bu durumda XLink ad alanı için "beklenen" önekini kullanırız. Daha sonra sorunsuz serializes:

<El xmlns:a="http://www.w3.org/2000/xlink" a:title="T" a:href="H"/> 

+4

Yanıtın tam olarak ne olduğundan emin değilim, ancak bu sorunla ilgili olabilir: http://stackoverflow.com/questions/8979267/xmlserializer-strips-xlink-from-xlinkhtml-svg-image-tag – Barbarrosa

+0

Teşekkürler İşaretçi Barbarrosa için. Chrome'un SVG/XLink işlemiyle ilgili raporlar görmüştüm. Ama aslında bunun için "düzeltmenin" yaşadığım problemin sebebi olabileceğinden korkuyorum. Bağlantınız ile aslında rahatsız edici kodlara bir adım daha yaklaşabilirim, bu yüzden teşekkürler! –

cevap

7

Hala Chrome'un XMLSerializer bir hata olduğunu oldukça eminim SVG handling of XLink attributes that Barbarrosa pointed to hitap ederken, büyük olasılıkla tanıtıldı. Ancak bunun için yaptığım bug report cevabının eksikliği göz önüne alındığında, ileriye doğru hareket etmek ve problemi çözmek için uğraştık.

Biz documentElement bu işlevini çağırarak soruna:

function EnsureXLinkNamespaceOnElement(element) 
{ 
    if (element.nodeType == 1) 
    { 
    var usesXLinkNamespaceUri = false; 
    var hasXLinkNamespacePrefixDefined = false; 
    for (var i = 0; i < element.attributes.length; i++) 
    { 
     var attribute = element.attributes[i]; 
     if (attribute.specified) 
     { 
     if (attribute.name.indexOf("xmlns:xlink") == 0) 
     { 
      hasXLinkNamespacePrefixDefined = true; 
     } 
     else if (attribute.namespaceURI == "http://www.w3.org/1999/xlink") 
     { 
      usesXLinkNamespaceUri = true; 
     } 
     } 
    } 
    if (usesXLinkNamespaceUri && !hasXLinkNamespacePrefixDefined) 
    { 
     element.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); 
    } 

    for (i = 0; i < element.childNodes.length; i++) 
    { 
     EnsureXLinkNamespaceOnElement(element.childNodes[i]); 
    } 
    } 
} 

işlevi basitçe xmlns:xlink nitelik Xline ad alanında atfedilen olan herhangi bir öğe üzerinde beyan olmasını sağlar. Fonksiyon ağacın üzerinden geçtiği ve bu nedenle oldukça zaman alıcı olabileceğinden, yalnızca 22 ve daha yeni sürümleri için Chrome'u çağırıyorum.

Not: Çoğu durumda, belge öğesinden xmlns:xlink ad alanını eklemekten de kurtulabilirsiniz çünkü oradan alınacaktır.Fakat bizim durumumuzda, belge elemanını düzenli bir ifade kullanarak çeviren başka bir kod vardı, bu yüzden güvenli bir şekilde oynamaya karar verdik ve gerekli olan her yere özniteliği eklemeye karar verdik.

Güncellemesi (20130324):

bug sabit ve ben de sürümüne 25.0.1364.172 m üzerine kendim doğrulamak mümkün olmuştur Chrome Canary 26'sında doğrulandı.

İlgili konular