• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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

    最重要的兩個類型:XpathEvaluatorXPathNSResolver

    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!

    img

    版權聲明:本文為qq_45359344原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_45359344/article/details/108333572

    智能推薦

    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 提...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡