Javascript學習筆記(九)——Javascript與XML
標簽: javascript notes js
Javascript與XML
瀏覽器對XML DOM的支持
DOM2級核心
創建一個新的、文檔元素為<root>
的XML文檔:
let xmldom = document.implementation.createDocument("", "root", null);
alert(xmldom.documentElement.tagName);
let child = xmldom.createElement("child");
xmldom.documentElement.appendChild(child);
DOMParser類型
解析XML之前,必須創建一個DOMParser的實例,在調用parseFromString()方法,該方法接收兩個參數:要解析的XML字符串和內容類型(“text/xml”),返回一個Document的實例
let parser = new DOMParser();
let xmldom = parser.parseFromString("<root><child/></root>", "text/xml");
alert(xmldom.documentElement.tagName);//root
alert(xmldom.documentElement.firstChild.tagName);//child
let anotherChild = xmldom.createElement("child");
xmldom.documentElement.appendChild(anotherChild);
let children = xmldom.getElementsByTagName("child");
alert(children.length);//2
DOMParser 只能解析格式良好的XML,因而不能把HTML 解析為HTML 文檔。在發生解析錯誤時, 仍然會從parseFromString() 中返回一個Document 對象, 但這個對象的文檔元素是<parsererror>
,而文檔元素的內容是對解析錯誤的描述。
let parser = new DOMParser(), xmldom, errors;
try{
xmldom = parser.parseFromString("<root>", "text/xml");
errors = xmldom.getElementsByTagName("parsererror");
if(errors.length > 0){
throw new Error("Parsing error");
}
}catch (ex) {
alert("Parsing error");
}
IE8及之前版本中的XML
略
跨瀏覽器處理XML
略
瀏覽器對XPath的支持
DOM3級XPath
最重要的兩個類型:XpathEvaluator
和XPathNSResolver
XPathEvaluator的三個方法:
- createExpression(expression, nsresolver):將XPath 表達式及相應的命名空間信息轉換成一個XPathExpression,這是查詢的編譯版。多次使用同一個查詢時很有用。
- createNSResolver(node):根據node 的命名空間信息創建一個新的XPathNSResolver 對象。在基于使用命名空間的XML 文檔求值時,需要使用XPathNSResolver 對象。
- evaluate(expression, context, nsresolver, type, result):在給定的上下文中,基于特定的命名空間信息來對XPath 表達式求值。剩下的參數指定如何返回結果。
evaluate()接收5 個參數:XPath 表達式、上下文節點、命名空間求解器、返回結果的類型和保存結果的XPathResult 對象(通常是null)。第三個參數(命名空間求解器)在XML 代碼中使用了XML 命名空間時要指定;如果XML 代碼中沒有使用命名空間,則這個參數應該指定為null。第四個參數的可能值:
- XPathResult.ANY_TYPE:返回與XPath 表達式匹配的數據類型。
- XPathResult.NUMBER_TYPE:返回數值。
- XPathResult.STRING_TYPE:返回字符串值。
- XPathResult.BOOLEAN_TYPE:返回布爾值。
- XPathResult.UNORDERED_NODE_ITERATOR_TYPE:返回匹配的節點集合,集合中節點的次序不一定與它們在文檔中的次序一致。
- XPathResult.ORDERED_NODE_ITERATOR_TYPE:返回匹配的節點集合,集合中節點的次序與它們在文檔中的次序一致。
- XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:返回節點集合的快照,對文檔的后續操作不會影響到這個節點集合。集合中節點的次序不一定與它們在文檔中的次序一致。
- XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:返回節點集合的快照,對文檔的后續操作不會影響到這個節點集合。集合中節點的次序與它們在文檔中的次序一致。
- XPathResult.ANY_UNORDERED_NODE_TYPE:返回匹配的節點集合,但集合中節點的次序不一定與它們在文檔中的次序一致。
- XPathResult.FIRST_ORDERED_NODE_TYPE:返回只包含一個節點的節點集合,包含的這個節點就是文檔中第一個匹配的節點。
let parser = new DOMParser();
let xmldom = parser.parseFromString("<root><employee><name><first></first><second></second><last></last></name></employee></root>", "text/xml");
let result = xmldom.evaluate("employee/name/*", xmldom.documentElement, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if(result !== null){
let node = result.iterateNext();
while (node){
alert(node.tagName);
node = node.iterateNext();
}
}
var result = xmldom.evaluate("employee/name", xmldom.documentElement, null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
if (result !== null) {
for (var i=0, len=result.snapshotLength; i < len; i++) {
alert(result.snapshotItem(i).tagName);
}
}
大量內容略
E4X
E4X的類型
E4X定義的幾個新的全局類型:
- XML:XML 結構中的任何一個獨立的部分。
- XMLList:XML 對象的集合。
- Namespace:命名空間前綴與命名空間URI 之間的映射。
- QName:由內部名稱和命名空間URI 組成的一個限定名。
大量內容略
JSON
語法
JSON的語法可以表示以下三種類型的值。
- 簡單值:使用與JavaScript 相同的語法,可以在JSON 中表示字符串、數值、布爾值和null。不支持undefined。
- 對象:一組無序的鍵值對。而每個鍵值對中的值可以是簡單值,也可以是復雜數據類型的值。
- 數組:一組有序的值的列表,可以通過數值索引來訪問其中的值。數組的值也可以是任意類型——簡單值、對象或數組。
JSON不支持變量、函數或對象實例。
簡單值
5
、"Hello world!"
等等,JSON中的字符串必須使用雙引號。
對象
Javascript對象字面量:
let person = {
name: "Nicholas",
age: 29,
};
JSON表示該對象:
{
"name": "Nicholas",
"age": 29
}
在對象中嵌入對象:
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}
數組
Javascript中的數組字面量:
let values = [25, "hi", true];
在JSON中的表示:
[25, "hi", true]
解析與序列化
JSON對象
JSON對象的兩個方法:stringify()
和parse()
,分別用于把Javascript對象序列化為JSON字符串和把JSON字符串解析為原生Javascript值
let book = {
title: "Professional Javascript",
authors: [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011
};
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText);
序列化選項
JSON.stringify()
除了要序列化的JavaScript 對象外,還可以接收另外兩個參數。第一個參數是個過濾器,可以是一個數組,也可以是一個函數;第二個參數是一個選項,表示是否在JSON 字符串中保留縮進。
過濾結果
如果過濾器參數是數組,那么JSON.stringify()的結果中將只包含數組中列出的屬性
let jsonText = JSON.stringify(book, ["title", "edition"]);
如果第二個參數是函數,行為會有不同。函數接收兩個參數,屬性(鍵)名和屬性值。根據屬性(鍵)名可以知道應該如何處理要序列化的對象中的屬性。屬性名只能是字符串,而在值并非鍵值對時,鍵名可以是空字符串。為了改變序列化對象的結果,函數返回的值就是相應鍵的值。如果函數返回了undefined,那么相應的屬性會被忽略
let jsonText = JSON.stringify(book, function (key, value) {
switch (key) {
case "authors":
return value.join(",")
case "year":
return 5000;
case "edition":
return undefined;
default:
return value;
}
});
字符串縮進
如果第三個參數是一個數值,那它表示的是每個級別縮進的空格數
let jsonText = JSON.stringify(book, null, 4);
最大縮進空格數為10,所有大于10 的值都會自動轉換為10。
如果縮進參數是一個字符串而非數值,則這個字符串將在JSON 字符串中被用作縮進字符(不再使用空格)。
toJSON()方法
可以為任何對象添加toJSON()
方法:
var book = {
"title": "Professional JavaScript",
"authors": [
"Nicholas C. Zakas"
],
edition: 3,
year: 2011,
toJSON: function(){
return this.title;
}
};
var jsonText = JSON.stringify(book);
JSON.stringify()
,序列化該對象的順序如下。
(1) 如果存在toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,返回對象本身。
(2) 如果提供了第二個參數,應用這個函數過濾器。傳入函數過濾器的值是第(1)步返回的值。
(3) 對第(2)步返回的每個值進行相應的序列化。
(4) 如果提供了第三個參數,執行相應的格式化。
解析選項
JSON.parse()
方法也可以接收另一個參數,該參數是一個函數,會在每個鍵值對上調用。這個函數被稱為還原函數(reviver),如果還原函數返回undefined,則表示要從結果中刪除相應的鍵;如果返回其他值,則將該值插入到結果中。
let book = {
title: "Professional Javascript",
authors: [
"Nicholas C. Zakas",
"Li Bai",
],
edition: 3,
year: 2011,
releaseDate: new Date(2011, 11, 1),
};
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText, function (key, value) {
if(key === "releaseDate"){
return new Date(value);
}else{
return value;
}
});
alert(bookCopy.releaseDate.getFullYear());
如果您覺得我的文章對您有幫助的話,可以點個贊,點個關注,也可以掃描下方二維碼關注我。我將在這個公眾號上更新自己的學習筆記,以及分享一些算法知識
Study and progress together with me!
智能推薦
JavaScript學習筆記(三)
1.5 運算符 1.5.1 定義 1.5.2 作用 1.5.3 分類 1.5.4 運算符的結合性 1.6 算術運算符 + 所有值和NaN做該運算,結果都是NaN 非數值型與數值型運算時會先轉換為數值型 任何的值和字符串做加法運算,都會先轉換為字符串,然后再和字符串做拼串的操作 - 所有值和NaN做該運算,結果都是NaN 非數值型與數值型運算時會先轉換為數值型 字符串做減法也會轉換為Number *...
學習JavaScript筆記3
DOM 文檔對象模型DOM,將html文檔以節點樹表示,類似于給HTML的結構畫出框圖。 exam: 通過id獲取元素 給標簽一個id<p id="con">咩咩咩<p>,id是唯一的,可代表這個標簽 var ttt = document.getElementById(“con”);語句為獲取標簽中的元素存儲在變量中 docume...
javaScript 對象學習筆記
javaScript 對象學習筆記 關于對象,這對我們軟件工程到學生來說是不陌生的。 因為這個內容是在過年學到,事兒多,斷斷續續,總感覺有一絲不順暢,但總結還是要寫一下的 JavaScript 對象 DOM 節點 JS 數字 JavaScript 中的所有事物都是對象:字符串、數值、數組、函數... 此外,JavaScript 允許自定義對象。 JavaScript 對象 JavaScript 提...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...