2011-09-27 33 views
5

我想將部分DOM序列化爲XHTML(有效的XML)。假設我有內部<body>只是一個元素,這是件我想序列:在JavaScript中,如何將序列化程序的一部分DOM轉換爲XHTML?

<div> 
    <hr> 
    <img src="/foo.png"> 
</div> 

有了這個,document.innerHTML給我,我想差不多的東西,除了它返回的HTML,而不是XHTML(即<hr><img>將不會正確關閉)。由於innerHTML沒有辦法,我怎樣才能將部分DOM序列化爲XHTML?

+1

你以後的瀏覽器兼容性是什麼? [這適用於我的Firefox和Chrome](https://developer.mozilla.org/en/XMLSerializer)。雖然我不知道IE。我發現他們使用了一個包裝,比如'if(!window.XMLSerializer){window.XMLSerializer = function(){}; window.XMLSerializer.prototype.serializeToString = function(XMLObject){return XMLObject.xml || ''; };}',儘管我不知道它是哪個瀏覽器(Mac - >沒有要測試的IE)。 –

+0

**現場演示:** http://jsfiddle.net/qUwXE/(但它在Chrome和Safari中不起作用) –

+0

@ŠimeVidas:謝謝......實際上,我在解析的XML文檔上使用它,也在Chrome中工作。太糟糕了,它不適用於HTML。 –

回答

3

我不知道,如果使用另一種語言(在JavaScript引擎的頂部)時一個選項。如果這是任何幫助,這將是這樣做的的XQuery(XQIB)的方式:

<script type="application/xquery"> 
    serialize(b:dom()//div) 
</script> 

例如,在以下頁面,序列化的XHTML寫成的網頁,而不是腳本標籤上的文字,在div標籤後面:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Serializing part of the DOM</title> 
    <meta charset="UTF-8"/> 
    <script type="text/javascript" src="mxqueryjs/mxqueryjs.nocache.js"></script> 
    </head> 
    <body> 
    <div> 
     <hr> 
     <img src="/foo.png"> 
    </div> 
    <script type="application/xquery"> 
     serialize(b:dom()//div) 
    </script> 
    </body> 
</html> 

HTML DOM被映射到XQuery數據模型(XML上的數據模型)。 b:dom()返回頁面的文檔節點,// div導航到所有後代div標籤。序列化函數然後將其序列化爲一個字符串。

但是,這將適用於IE9 +(不是6+)和最新版本的Chrome,Firefox,Safari,Opera。

0

這不是測試的代碼,但我會遞歸掃描父元素的兒童和建設XHTML是這樣的:

var parent; 
var parse = function(el) { 
    var res = ""; 
    for(var i=0; i < el.childNodes.length; i++) { 
    var child = el.childNodes[i]; 
    res += "<"+child.tagName; 
    // scan through attributes 
    for(var k=0; k < child.attributes.length; k++) { 
     var attr = child.attributes[k]; 
     res += " "+attr.name+"='"+attr.value+"'"; 
    } 
    res += ">"; 
    res += parse(child); 
    res += "</"+child.tagName+">"; 
    } 
    return res; 
} 
var xhtml = parse(parent); 
+3

也許手動序列化是唯一的跨瀏覽器兼容的方式,但是有點複雜。您的代碼不起作用。這裏應該有一個圖書館。 –

0

Sarissa,跨瀏覽器的Javascript兼容性庫中有缺乏一個瀏覽器的一個XmlSerializer實現:

http://dev.abiss.gr/sarissa/jsdoc/symbols/XMLSerializer.htm

They also have an example of how to use it,這就是:

var xmlString = new XMLSerializer().serializeToString(someXmlDomNode); 

據他們說,瀏覽器對其庫的支持很好:

支持的瀏覽器是Mozilla - Firefox和家族,MSXML3.0及更高版本的Internet Explorer,Konqueror(肯定可以使用KDE 3.3+),Safari和Opera。

相關問題