• Xml学习笔记(二)Javascript篇


    Preface:本文是W3Schools上《XML指南》Javascript篇的学习笔记。其中大部分内容是对指南的翻译总结。由于原文的例子更详尽生动,如果各位想阅读原文可以到这个网址http://www.w3schools.com/xml/default.asp。 同时,W3Schools提供了测试,大家可以测测自己对XML的理解程度。

    一、XML解析器(Parser)

            所有的现代浏览器都会内建一个XML解析器(Parser)来读取和操作XML。Parser将XML读入内存中将之转换为一个DOM(Documnet Object Model)对象。我们可以使用JavaScript存取到这个对象。(备注,Microsoft的Parser可以加载XML文件和字符串中的XML内容,而其他的一些Browser则分别使用不同的Parser去实现。)所有的Parser都可以遍历XML树,读取、插入、删除节点(elements)和attribute。在谈论XML解析时,我们是用Nodes(节点)来代替Elements(元素)。

            一般我们会从两个地方加载XML:XML文件或者包含XML的string(字符串)。

    使用MicrosoftParser加载XML文件
    var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async
    ="false";
    xmlDoc.load(
    "note.xml"); 
    使用Parser读取保存在string(字符串)中的XML内容
    var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async
    ="false";
    xmlDoc.loadXML(txt);

    注意以上是使用同一个对象的不同方法去实现的。其他的Browser则是用不同的对象去实现。
    var xmlDoc=document.implementation.createDocument("","",null);
    xmlDoc.async
    ="false";
    xmlDoc.load(
    "note.xml");

    var parser=new DOMParser();
    var doc=parser.parseFromString(txt,"text/xml");

    二、XML DOM

          DOM(Document Object Model)定义了一种标准的方式去存取和操作XML文件。DOM将XML视作一个树结构。通过DOM可以增加、修改、删除Element,同时可以修改包括Element的Attribute和Element包含的内容(text)。我们将一个Element及其包含的所有东西(Attribute、Text)称作一个Node。

    以下是读取<to>的节点的语句:
    xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
    和用HTML的DOM读取一个id="to"的语句比较可以看到很多相似之处:
    document.getElementById("to").innerHTML
    (更多有关的DOM内容,可以参考XML DOM指南)

          下面是一个完整的例子。用JavaScript从一个XML文件中读取内容,显示到HTML中。以下代码是跨浏览器的。已经考虑到不同浏览器的问题。

    <html>
    <head>
    <script type="text/javascript">
    function parseXML()
    {
    try
      {
    //try IE first
      xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
      }
    catch(e)
      {
      
    try
        {
    //try Mozilla, Firefox, Opera, etc.
        xmlDoc=document.implementation.createDocument("","",null);
        }
      
    catch(e)
        {
        alert(e.message);
        
    return;
        }
      }
    xmlDoc.async
    =false;
    xmlDoc.load(
    "note.xml");

    document.getElementById(
    "to").innerHTML=
    xmlDoc.getElementsByTagName(
    "to")[0].childNodes[0].nodeValue;
    document.getElementById(
    "from").innerHTML=
    xmlDoc.getElementsByTagName(
    "from")[0].childNodes[0].nodeValue;
    document.getElementById(
    "message").innerHTML=
    xmlDoc.getElementsByTagName(
    "body")[0].childNodes[0].nodeValue;
    }
    </script>
    </head>

    <body onload="parseXML()">
    <h1>W3Schools Internal Note</h1>
    <p><b>To:</b> <span id="to"></span><br />
    <b>From:</b> <span id="from"></span><br />
    <b>Message:</b> <span id="message"></span>
    </p>
    </body>
    </html>

          然后下面这个例子可以快速浏览甚至略过,和上面代码的区别,紧紧是先把XML存到一个string中,然后再用Parser把XML从string中读出来。

    <html>
    <head>
    <script type="text/javascript">
    function parseXML()
    {
    var text="<note>";
    text
    =text+"<to>Tove</to>";
    text
    =text+"<from>Jani</from>";
    text
    =text+"<heading>Reminder</heading>";
    text
    =text+"<body>Don't forget me this weekend!</body>";
    text
    =text+"</note>";
    try
      {
    // code for IE
      var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async
    ="false";
      xmlDoc.loadXML(text);
      }  
    catch(e)
      {
    // code for Mozilla, Firefox, Opera, etc.
      try
        {
        
    var parser=new DOMParser();
        
    var xmlDoc=parser.parseFromString(text,"text/xml");
        }
      
    catch(e)
        {
        alert(e.message);
        
    return;
        }
      }
    document.getElementById(
    "to").innerHTML=
    xmlDoc.getElementsByTagName(
    "to")[0].childNodes[0].nodeValue;
    document.getElementById(
    "from").innerHTML=
    xmlDoc.getElementsByTagName(
    "from")[0].childNodes[0].nodeValue;
    document.getElementById(
    "message").innerHTML=
    xmlDoc.getElementsByTagName(
    "body")[0].childNodes[0].nodeValue;
    }
    </script>
    </head>

    <body onload="parseXML()">
    <h1>W3Schools Internal Note</h1>
    <p><b>To:</b> <span id="to"></span><br />
    <b>From:</b> <span id="from"></span><br />
    <b>Message:</b> <span id="message"></span>
    </p>
    </body>
    </html>


    三、XML to HTML

          指南中给出例子的思路就是一边用XML DOM读取XML的内容,一边不停的用document.write写HTML标记和读取到的XML内容。和上面的例子差不多,就不再转贴代码了。

    四、XMLHttpRequestObject

          这个东西很厉害啊,大名鼎鼎的Ajax就是从这东西变出来的。

    什么是XMLHttpRequestObject?XMLHttpRequestObject是开发人员的梦,因为有了它,你就可以:
    • 为网页增加新数据而无需重新加载页面。
    • 在网页加载后向Server请求数据。
    • 在网页加载后从Server接受数据。
    • 在后台向Server传送数据。
    其实以上说的都是一回事,关键三个字“无刷新”。

    马上看一个例子:

    <html>
    <head>
    <script type="text/javascript">
    var xmlhttp;
    function loadXMLDoc(url)
    {
    xmlhttp
    =null;
    if (window.XMLHttpRequest)
      {
    // code for IE7, Firefox, Opera, etc.
      xmlhttp=new XMLHttpRequest();
      }
    else if (window.ActiveXObject)
      {
    // code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    if (xmlhttp!=null)
      {
      xmlhttp.onreadystatechange
    =state_Change;
      xmlhttp.open(
    "GET",url,true);
      xmlhttp.send(
    null);
      }
    else
      {
      alert(
    "Your browser does not support XMLHTTP.");
      }
    }

    function state_Change()
    {
    if (xmlhttp.readyState==4)
      {
    // 4 = "loaded"
      if (xmlhttp.status==200)
        {
    // 200 = "OK"
        document.getElementById('A1').innerHTML=xmlhttp.status;
        document.getElementById(
    'A2').innerHTML=xmlhttp.statusText;
        document.getElementById(
    'A3').innerHTML=xmlhttp.responseText;
        }
      
    else
        {
        alert(
    "Problem retrieving XML data:" + xmlhttp.statusText);
        }
      }
    }
    </script>
    </head>

    <body>
    <h2>Using the HttpRequest Object</h2>

    <p><b>Status:</b>
    <span id="A1"></span>
    </p>

    <p><b>Status text:</b>
    <span id="A2"></span>
    </p>

    <p><b>Response:</b>
    <br /><span id="A3"></span>
    </p>

    <button onclick="loadXMLDoc('note.xml')">Get XML</button>

    </body>
    </html>

          以上的代码是在button的OnClick中读取一个xml文件的内容然后进行显示。这里要强调的是:这里并不是把隐藏的内容显示出来而是确实从Server的XML读取到数据然后作显示的,而且是无刷新的。可以到这个网址去体现一下http://www.w3schools.com/xml/tryit.asp?filename=tryxml_httprequest_js
          Open的true是表示是否进行异步操作,true表示script继续运行而不必等待Server的应答。了解更多的XMLHttpRequest对象,可以到网上查找一下XMLHttp的CHM文档。 注意XMLHttpRequest对象并不是W3C标准建议的。

    五、总结

    柔合以上的知识就可以使用JavaSripte灵活的读写XML了。在这里我们用到了多种的的Web技术,包括:
    • HTML和HTML DOM
    • XML和XML DOM
    • JavaScript
    • XMLHttp相关对象
    本篇简介了以上的某些技术,而关键的是多种的柔合。Ajax不就是这样出来的么,呵呵。

    本文为个人原创,转载请注明出自:http://jackma.cnblogs.com/ 
    Author:JackMa
  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/JackMa/p/1068009.html
Copyright © 2020-2023  润新知