Either DOMParser or XMLSerializer is dropping my n

2020-03-24 04:54发布

问题:

So I think there are probably cleaner solutions than what I am doing anyway, but I'm wondering if this is a known issue, if there's something obvious I'm doing wrong, etc...

For reasons not worth describing, I have some Javascript code that, in one possible path, is loading XML from a string using DOMParser, then serializing it back to a string with XMLSerializer. The XML document is an XSL stylesheet. There are two xmlns elements in the main xsl:stylesheet tag: One which declares the xsl namespace, and another which declares a custom namespace that I use. (Call it "foo")

In IE9, at least, when I get the output back from the round trip through DOMParser, the xmlns:xsl element is still there, but the xmlns:foo element is missing. Is this expected behavior? What am I missing?

回答1:

I made a test case http://home.arcor.de/martin.honnen/javascript/2012/test2012070901.html and I can confirm that the output with IE 9 on Windows 7 is

Input
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:foo="http://example.com/foo">
<xsl:template match="foo:bar">Test</xsl:template>
</xsl:stylesheet>
Output
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="foo:bar">Test</xsl:template>
</xsl:stylesheet>

so the namespace declaration is dropped. I consider that a bug in IE 9, you might want to check connect.microsoft.com whether anything like that is already reported, and if not file it. Is anyone reading here using IE 10? What does IE 10 show?

[edit]There is a connect issue on IE 10, probably related: https://connect.microsoft.com/IE/feedback/details/728093/xmlserializer-omits-xmlns-attributes.



回答2:

I was also experiencing this issue. In IE11, I had some javascript serializing XML and the namespace URI's were being dropped.

As a workaround I used the createElementNS method when creating the appropriate child node.

So for example, instead of ...

var r = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:n0="web5540"></soap:Envelope>';
var m = new DOMParser().parseFromString(r, "text/xml");
var n = m.createElement('n0:GetSales');
var p = m.firstChild;
p.appendChild(n);
var k = new XMLSerializer().serializeToString(m);
// In IE, k = "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" ><n0:GetSales /></soap:Envelope>"

... I end up doing this ...

var r = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"></soap:Envelope>';
var m = new DOMParser().parseFromString(r, "text/xml");
var n = m.createElementNS('web5540', 'n0:GetSales');
var p = m.firstChild;
p.appendChild(n);
var k = new XMLSerializer().serializeToString(m);
// In IE, k = "<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><n0:GetSales xmlns:n0="web5540" /></soap:Envelope>"

I am not sure this would help in the original case, as the DOMParser would be doing all of the element creation, but I decide to post in case someone else is having a similar issue.