【问题标题】:Convert a DOM Node or Document to XML in JavaScript在 JavaScript 中将 DOM 节点或文档转换为 XML
【发布时间】:2010-10-24 04:40:35
【问题描述】:

假设您在 JavaScript 中收到了一个 DOM 元素或文档(例如 window.document),您将如何将其转换为有效的 XML?

更具体地说,对于我的示例,我有一个显示 SVG 的网页,这个 SVG 有很多 JavaScript 来允许交互。这是一个图表显示,可以让您放大图表,甚至进行一些转换。现在用户想要有一个“保存图像”按钮。我想这样做的方法是获取 SVG 元素的文档节点,并将其转换为 XML,然后将其发送到服务器,然后服务器返回包含 SVG 文档或 PNG 图像的页面。

这一切都在 FireFox 上运行(目前这是用户的要求,尽管它在 Safari 和 Chrome 中也可以正常工作)。在网页的 Firefox 中,我已将 SVG 文档作为对象元素包含在内。在 javascript 中,我可以访问该对象 contentDocument,它指的是 XML 页面的根。它包含 XML 版本、一个 Document 标签和具有所有属性的根 svg 标签。

也许有人已经解决了这个问题,所以我可以复制他们的代码。也许有人知道在哪里寻找萤火虫来实现这一目标。或者,可能已经有 DOM 方法了。

【问题讨论】:

    标签: javascript dom svg


    【解决方案1】:

    有一个非标准的 API 对象:XMLSerializer(虽然它在除 IE 浏览器之外的所有浏览器中都实现,但它不是标准的)。

    它的 serializeToString 方法需要传递 DOMNode 对象。

    var sXML = new XMLSerializer().serializeToString(document.body);
    

    在 Internet Explorer 中,无法为 HTML 检索正确的 XML,除非获取 .outerHTML 并修复所有与序列化为 HTML 相关的问题(例如属性中缺少引号、未闭合标签等)

    【讨论】:

    • var br = document.createElement('br'); new XMLSerializer().serializeToString(br) 结果是'
      '。它不是 XML,但 '
      ' 是。如何获得严格的 XML 字符串?
    【解决方案2】:

    我明天将不得不研究 XMLSerializer。这是我最终编写的代码,以防万一有人感兴趣(未知节点需要原型和 FireBug):

    function extractXML(node) {
        switch (node.nodeType) {
            case 1: return extractNodeXML(node);
            case 2: return extractAttributeXML(node);
            // 3 = Text node
            case 3: return node.nodeValue;
            // 8 = Comment node - ignore
            case 8: return "";
            case 9: return extractDocumentNodeXML(node);
            case 10: return extractDocumentTypeXML(node);
            default: console.log(node); return "Unkwon type: "+node.nodeType;
        }
    }
    function extractNodeXML(node) {
        var xml = "<"+node.nodeName;
        $A(node.attributes).each(function (node) {xml += " "+extractXML(node)});
        xml +=">"
        $A(node.childNodes).each(function (node) {xml += extractXML(node)});
        xml += "</"+node.nodeName+">"
        return xml;
    }
    function extractAttributeXML(node) {
        return node.nodeName+"=\""+node.nodeValue+"\""
    }
    function extractDocumentNodeXML(node) {
        var xml = "<?xml version=\""+node.xmlVersion+"\" encoding=\""+node.xmlEncoding+"\"?>"
        $A(node.childNodes).each(function (node) {xml += extractXML(node)});
        return xml;
    }
    function extractDocumentTypeXML(node) {
        return "<!DOCTYPE "+node.name+" PUBLIC \""+node.publicId+"\" \""+node.systemId+"\">"
    }
    

    【讨论】:

      猜你喜欢
      • 2017-08-13
      • 1970-01-01
      • 2010-11-20
      • 2010-10-18
      • 2011-05-10
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多