2009-05-06 13 views
3

JavaScriptで1つのDOM要素またはドキュメント(たとえばwindow.document)が渡されたとします。どのように有効なXMLに変換するとしますか?DOMノードまたはドキュメントをJavaScriptでXMLに変換する

具体的には、私の例では、SVGを表示するWebページがあります。このSVGには、相互作用を可能にするJavaScriptがたくさんあります。グラフを表示して、グラフを拡大したり、いくつかの変形を加えたりすることもできます。これで、ユーザーは「画像を保存」ボタンを持っています。私がこれをやっていると想像しているのは、SVG要素のドキュメントノードをXMLに変換し、それをサーバーに送信し、SVGドキュメントまたはPNGイメージを含むページを返します。

これはFireFoxで実行されています(SafariとChromeでもうまく機能しますが、現在はユーザーの要件です)。 Webページのfirefoxでは、SVGドキュメントをObject要素として含めました。 javascriptでは、XMLページのルートを参照するcontentDocumentオブジェクトにアクセスできます。 XMLバージョン、Documentタグ、およびすべての属性を持つルートsvgタグが含まれています。

多分誰かがすでにこの問題を解決しているので、コードをコピーできます。おそらく誰かがこれを達成するために火かぶ虫を見る場所を知っているかもしれません。あるいは、既にDOMメソッドがあります。

答えて

4

非標準のAPIオブジェクトがあります:XMLSerializer(これはIEブラウザ以外のすべてで実装されていますが、標準ではありません)。

そのserializeToStringメソッドは、DOMNodeオブジェクトが渡されることを想定しています。 Internet Explorerで

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

は.outerHTMLを取得し、HTMLにシリアライズに付属するすべての問題を解決しない限り、(などの属性では引用符ではなく、閉じタグが欠落していると)、

HTMLのための適切なXMLを取得する方法はありません
+0

するvar BR =のdocument.createElement(「BRを」); 新しいXMLSerializer()。serializeToString(br) 結果は '
'です。 XMLではありませんが、 '
'です。厳密なXML文字列を取得するにはどうすればよいですか? –

1

明日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+"\">" 
} 
+0

正解ではありませんが。 +1クールネス8-) – PlanetUnknown

関連する問題