【问题标题】:xmlserializer strips xlink from xlink:html svg image tagxmlserializer 从 xlink:html svg 图像标签中去除 xlink
【发布时间】:2012-01-23 22:03:32
【问题描述】:

我正在创建一个 javascript 界面以将 xlinked 图像动态添加到教室地图中。

 //declare the xlink namespace in the svg header
 xmlns:xlink="http://www.w3.org/1999/xlink"
...
//the code to append the image
var temp = document.createElementNS(svgns,"image");
temp.setAttributeNS(null,"x","0");
temp.setAttributeNS(null,"y","0");
temp.setAttributeNS(null,"height","80");
temp.setAttributeNS(null,"width","40");
temp.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href","roomlayouts/items/ cactus.svg");

图像附加并显示在屏幕上,带有如下标签:

<image x="0" y="0" height="80" width="40" xlink:href="roomlayouts/items/cactus.svg"></image>

但是一旦我将它通过 xmlserializer 以便我可以保存文件,它就会从前面剥离 xlink 标记:

var svgDoc = document.getElementById('SVGMap');
var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(svgDoc.firstChild);

创作:

<image x="0" y="0" width="40" height="80" href="roomlayouts/items/cactus.svg"></image>

这意味着 svg 丢失了仙人掌。有什么想法可以让 xmlserializer 保留 xlink 前缀吗?

=============================== 注意:这是 webkit 中的一个错误,现已解决。请参阅下面的讨论以获取错误报告的链接

【问题讨论】:

    标签: javascript html svg xmlserializer


    【解决方案1】:

    进一步调查

    我创建了一个test SVG file on my server

    1. 有一个&lt;image&gt;,其中包含适当命名空间的href 属性。
    2. 使用 JS 创建一个新的&lt;image&gt; 使用setAttributeNS(xlinkNS,'xlink:href',…)
    3. 使用 JS 创建一个新的&lt;image&gt; 使用setAttributeNS(xlinkNS,'href',…)
    4. 使用 JS 克隆原始(有效)&lt;image&gt; 元素。
    5. 最后,序列化 XML 并记录结果。

    WebKit 中的结果

    Safari 和 Chrome 开发者工具都将 DOM 显示为:

    <image xlink:href="…" />
    <image xlink:href="…" />
    <image href="…" />
    <image xlink:href="…" />
    

    但是,记录到控制台的 XML 序列化(如果您右键单击元素并说“复制为 HTML”,您也会得到)显示如下:

    <image xlink:href="…" />
    <image xlink:href="…" />
    <image href="…" xmlns="http://www.w3.org/1999/xlink" />
    <image xlink:href="…" />
    

    Firefox 中的结果

    Firebug 还为生成的 DOM 显示了这一点:

    <image xlink:href="…" />
    <image xlink:href="…" />
    <image href="…" />
    <image xlink:href="…" />
    

    但是,Firebug 控制台显示了合理的(预期的)序列化:

    <image xlink:href="…" />
    <image xlink:href="…" />
    <image xlink:href="…" />
    <image xlink:href="…" />
    

    进一步调查表明,即使您使用如下代码:

    img.setAttributeNS(xlinkNS,'GLARBLE:href',…);
    

    Firebug 将显示“GLARBLE:href”作为属性名称,但 XML 序列化使用名称空间的 URI,在根 &lt;svg&gt; 元素上找到匹配的名称空间并正确生成:

    <image xlink:href="…" />
    

    结论

    当使用setAttributeNS 创建一个没有为属性名称提供命名空间前缀的命名空间属性时,Webkit 执行的 XML 序列化似乎存在缺陷(损坏)。

    但是,如果您为属性名称提供与文档中已声明的名称空间前缀匹配的名称空间前缀,则序列化似乎可以正常工作。

    【讨论】:

    • 嗨 Phrogz,你让我觉得我的问题可能在其他地方。制作 svg 后,我将其序列化并保存。当我尝试重新加载它时,除了植物之外,所有东西都加载了。如果我编辑文件并在 html 标记之前添加 xlink: 则它们会出现,因此我尝试使用 xlink:html 而不是纯 html。知道为什么它们没有出现吗?
    • @pluke 查看我的更新和调查。您是否以编程方式创建 &lt;svg&gt; 元素,如果是,您如何/在哪里设置通用 XLink 命名空间前缀?
    • 我正在使用:w3.org/2000/svg" xmlns:xlink="w3.org/1999/xlink" ....> 和其他一些命名空间声明。听起来可以吗?我需要更仔细地查看您的代码,看看是否有任何差异。据我所见,当我动态创建图像时,它以与 [2.] 相同的方式显示,但是当我将其序列化以保存它时,xlink 被剥离,当我重新加载它时,它根本不会显示。
    • 如果你使用 var xlinkNS = svg.getAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xlink'); 代替它在 Opera 中工作,但在其他地方不工作,如果 OTOH 你使用 var xlinkNS = svg.getAttributeNS('http://www.w3.org/2000/xmlns/', 'xlink'); 那么它在所有这些都工作。注意:对于“作品”,我仅表示图像显示了四次,而不是以相同的方式序列化。另见w3.org/TR/DOM-Level-3-Core/core.html#Namespaces-Considerations
    • 我想我已经找到了问题的一部分,当我以编程方式制作 svg 时,我将 svg 标头标记构建为带有代码的字符串:&lt;svg xmlns="w3.org/2000/svg"; xmlns:xlink="w3.org/1999/xlink"; ....&gt; 但是一旦序列化它就会剥离xmlns: leave: &lt;svg xmlns="w3.org/2000/svg"; xlink="w3.org/1999/xlink"; ....&gt; 表示它不能正确处理 xlink。关于如何阻止序列化程序执行所有这些标签剥离的任何想法?
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 2021-06-05
    • 1970-01-01
    • 2013-07-13
    • 2014-03-19
    相关资源
    最近更新 更多