js操作xml
JavaScript操作XML是通過XML DOM來完成的 Ie 下面是用ActiveX對象來實現的。
那么什么是XML DOM呢?
XML DOM 是:
也就是說:
XML DOM 是用于查詢、添加、修改、刪除XML 元素的標準。
那么什么是XML DOM呢?
XML DOM 是:
- 用于 XML 的標準對象模型
- 用于 XML 的標準編程接口
- 中立于平臺和語言
- W3C 的標準
也就是說:
XML DOM 是用于查詢、添加、修改、刪除XML 元素的標準。
ie創建 xml
function xmlcreate() {
var version = [
'MSXML2.DOMDocument6.0',
'MSXML2.DOMDocument3.0',
'MSXML2.DOMDocument'
];
for(var i=0; i<version.length;i++) {
try {
var xml = new ActiveXObject(version[i]);
return xml;
}catch(e) {
}
}
throw new Error('您的系統不支持MSXML庫');
}
//載入XML文件,兩種方式:1.加載XML字符loadXML();2.加載XML外部文件load()
xml.loadXML('<root>\n<user>Lee</user>\n</root>'); //加載XML字符串
alert(xml.xml);
打印第一個內容 必須用標準DOM
alert(xml.getElementsByTagName('user')[0].firstChild.nodeValue);
加載外部xml
xml.load('a.xml');
動態添加xml
xml.load('a.xml');
var b = xml.createElement('bbb');
var root = xml.documentElement;
root.appendChild(b);
alert(xml.xml);
服務器端 同步/異步
在服務器端 默認用的異步加載 沒加載完畢 就打印 肯定出不來
把這個值設為false 就能同步加載了
xml.async = false;
但是如果xml過大 會造成假死狀態
不過異步比較好 但是異步又獲取不到內容 這該怎么辦呢
有個事件
xml.onreadystatechange = function
這個事件可以判斷是否加載完成 不過要先載入事件 先把事件加載到內存中 然后再載入xml
事件里面有個屬性 xml.readyState 可以判斷是否加載完成
這個函數等xml全部加載好 開始處理
xml.onreadystatechange = function() {
if(xml.readyState ==4){ //如果正確就輸出
if(xml.parseError == 0) {
alert(xml.xml);
}else { //如果錯誤 就返回
var a = "錯誤代碼"+xml.parseError.errorCode+'\r\n';
a += "錯誤行號"+xml.parseError.line+'\r\n';
a += "錯誤上一行"+xml.parseError.linepos+'\r\n';
a += "錯誤信息"+xml.parseError.reason+'\r\n';
alert(a);
}
}
}
DOM2操作xml
//create xml 第一個參數 命名空間 第二個 根節點 第三個 文檔聲明
var xml = document.implementation.createDocument('','root',null); //創建xml
var user = xml.createElement('user');
xml.documentElement.appendChild(user); //插入user
alert(xml.getElementsByTagName('user')[0].tagName); //取得user
dom2也有load方法 默認也是異步的 可以通過設置同步來加載
獲取一條信息
var xml = document.implementation.createDocument("",'root',null);
xml.async = false;
xml.load('a.xml');
alert(xml.getElementsByTagName('url')[0].firstChild.nodeValue);
也可以 通過 textContent 不過 ie不支持
alert(xml.getElementsByTagName('url')[0].textContent);
dom如果異步的話 怎么判斷是否加載完成呢 可以通過load方法判斷 比ie簡單了很多
var xml = document.implementation.createDocument("",'root',null);
xml.onload = function(){
alert(xml.getElementsByTagName('url')[0].textContent);
}
xml.load('a.xml');
ps 不過 load 只支持 firefox 和最新版本的opera
但是 w3c提供了2個對象處理xml
var xml = new DOMParser(); //實例化xml對象
var a= "<root><user>gwyy</user></root>";
var xmldom = xml.parseFromString(a,'text/xml'); //通過xml對象創建xml
var seria = new XMLSerializer() //序列號xml
var z = seria.serializeToString(xmldom);
alert(z);
DOM2沒有錯誤對象 出錯了 會給你返回一段xml格式的錯誤信息
//判斷錯誤
var errors = xmldom.getElementsByTagName('parsererror');
if(errors.length > 0) {
throw new Error('錯誤信息:'+errors[0].textContent);
}
下面是跨瀏覽器創建xml
//跨瀏覽器創建
function createxml(xmlstr) {
var xml = null;
if(typeof window.DOMParser != "undefined") {
xml = (new DOMParser).parseFromString(xmlstr,'text/xml');
var errors = xml.getElementsByTagName('parsererror');
if(errors.length > 0){
throw new Error('錯誤信息:'+errors);
}
} else if(typeof window.ActiveXObject != "undefined") {
var version = [
'MSXML2.DOMDocument6.0',
'MSXML2.DOMDocument3.0',
'MSXML2.DOMDocument'
];
for(var i=0;i<version.length;i++) {
try{
xml = new ActiveXObject(version[i]);
return xml;
}catch(e){
}
}
xml.loadXML(xmlstr);
if(xml.parseError != 0) {
throw new Error('錯誤信息'+xml.parseError.reason);
}
return xml;
} else {
throw new Error('你的系統或瀏覽器不支持xml');
}
return xml;
}
//序列化
function serializerXMl(xmlstr) {
var xml = "";
if(typeof window.XMLSerializer != "undefined") {
xml = (new XMLSerializer()).serializeToString(xmlstr);
} else if(typeof xmlstr.xml != "undefined"){
xml = xmlstr.xml;
}
return xml;
}
//實現
var xmlstr = "<root><user>aaaa</user></root>";
var xmldom = createxml(xmlstr);
alert(serializerXMl(xmldom));
為了跨瀏覽器 xml 只能放棄從外部加載xml