以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 XML基础 』  (http://bbs.xml.org.cn/list.asp?boardid=1)
----  初学时的笔记!有点乱  (http://bbs.xml.org.cn/dispbbs.asp?boardid=1&rootid=&id=6465)


--  作者:diegor
--  发布时间:4/5/2004 3:47:00 PM

--  初学时的笔记!有点乱
语法:
 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")                            'JAVASCRIPT中的创建对象

 set objXml=CreateObject("Microsoft.XMLDOM")                                   '创建解析器对象
 objXml.async="false"
 objXml.load("test.xml")                                                       '装载xml文件

 objXml.load(Server.MapPath("test.xml"))                  '根据绝对路径装载xml文件

 Set objRootsite = xmlDoc.getElementsByTagName("NewList")                '查找某一节点"NewList"
 objNextRootsiteName = xmlDoc.getElementsByTagName("NewList").item(0).nodeName
 Set objRootsite = objXml.documentElement.selectSingleNode("NewList")          '查找某一节点"NewList"
 document.write(objRootsite.nodeName)                                          '当前节点名称
 objNextRootsite = objRootsite.childNodes.item(1)                              '查找"NewList"的第一子节点
 objNextRootsiteText = objNextRootsite.childNodes.item(1).text                 '查找"NewList"的第一子节点的节点内容


 xmlChildNode = objXml.documentElement.childNodes                              '获取当前节点
 document.Write (xmlChildNode.nodename)                                        '当前节点名称
 document.write (xmlChildNode.text)                                            '当前节点文本内容
 frm.label.innerText = xmlChildNode.item(1).text                               '将Xml中的文本内容转换为Html中的内容

 xmlChildNode.GetAttributeNode("name").Nodevalue          '获取属性名为name的属性值

 xmlChildNode.length             'xmlChildNode节点的子节点数量

                '取出一个节点的属性集合
 set objnodes=objXml.documentElement.SelectSingleNode("//people/man").GetAttributeNode("name").attributes
 for each element in objnodes
  response.write element.nodename           '属性名
  response.write element.nodevalue                                      '属性值
 next

 xmlDoc.getElementsByTagName("from").item(0).text

 xmlDoc.removeChild objRootsite            '删除某个节点


        objXml.parseError                                                             '错误接受容器
 
 objXml.parseError.errorCode             '返回长整型错误代码
 objXml.parseError.reason               '返回字符串型错误原因
 objXml.parseError.line               '返回长整型错误行号
 objXml.parseError.linePos               '返回长整型错误行字符位置
 objXml.parseError.srcText               '返回错误所在行的源代码
 objXml.parseError.url                      '返回url装载文档指针---最近一份含有解析错误的XML文档的URL地址
 objXml.parseError.filePos               '返回长整型错误文件位置---在文档中的绝对字符位置
 
 
访问DOM树中的元素与属性

 DOM还提供了许多查找节点的方法。其中基于搜索机制的方法有:
  ● 根据标签名称搜索元素;
  ● 使用XSL模式搜索节点;
  ● 利用集合索引搜索节点。
  
  以books.xml为例,Document对象中的getElementsByTagName方法就是根据参数中的标签名称在全文范围内查找元素的,返回值是一个NodeList对象:
  Set doc = dsoDetails.XMLDocument
  Set authors = doc.getElementsByTagName("author")  
  上述查询结果中包含了文档中出现的全部4位作者。如果调用的是Element对象中的getElementsByTagName方法,除了搜索范围缩小为该元素的所有后继节点之外,其他的情况都是一样的。
  
  所有类型的节点都带有selectNodes方法,该方法的唯一参数是XSL的模式规则,返回值是匹配该规则的结果集合。调用这个方法可以利用XSL的模式匹配策略查找节点。例如:
  Set rootNode = doc.documentElement
  Set cheapbooks = rootNode.selectNodes("//book[price < 10]")
  这个例子返回所有售价低于10元的<book>元素。另外,节点中的selectSingleNodes方法的用法与selectNodes是一样的,只是返回结果为查找到的满足条件的第一个节点而已。
 
  对于元素节点,获取元素标签名称的方法有两种:anyElement.nodeName和anyElement.tagName。前者是Node对象的属性,后者是Element对象的属性。
  如果想获取元素中的文本内容,如: <price>9.95</price>时,访问Element对象中的nodevalue属性是错误的,这时返回结果是null,而不是预期的9.95。
  含有文本内容的元素都包含一个Text类型的子节点,所以只有通过Text对象中的nodevalue属性才能真正访问到文本内容。
  
 添加元素的步骤如下:
  ● 创建一个Text节点并赋值;
  ● 创建Element节点;
  ● 把Text节点挂在Element节点下,作为它的子节点;
  ● 把Element节点插入到XML文档的合适位置上。
  
 对于元素节点的删除和替换操作,首先都要对操作对象进行定位,然后相应地执行对象节点所属父节点的removeChild方法和replaceChild方法即可。
 Attr节点的各种操作在原理上与Element节点相同。Attr对象同样继承了Node对象中的各种方法和属性,并且MSXML中还提供了name属性和value属性,能够更直接地访问到属性信息。
 另外,还可以通过属性所属元素的相关方法访问属性,如通过getAttribute和setAttribute方法读取属性值或修改属性值,或者用getAttributeNode方法直接返回Attr对象。
 创建新属性最直接的办法就是使用Element对象中的setAttribute方法。也可以先用Document对象中的createAttribute方法设置属性值,然后使用Element对象中的setAttributeNode方法把新节点添加到DOM树中。
 同样地,删除属性最直接的方法是调用Element中的removeAttribute方法。另外一种方案是先用getAttributeNode方法对操作对象进行定位,然后执行removeAttributeNode操作。

 从以上的介绍中可以看出,由于节点间的继承关系,以及各种类型节点本身提供的丰富的接口,用户可以很容易地找到一套适合自己需要的对象操作方案。

 DOM的显示功能
 
 DOM技术还可以用来显示XML数据。XSL样式单面向的是XML文档的转换,用于显示格式的转换是其应用的一个方面,所以在显示功能上还存在着一些不足:
  ● 不易完成对XML数据的复杂处理,如将英文字母全部转换为大写,截取指定长度的字符串,忽略一些特定的标点等;
  ● 不易对XML数据中的数值进行计算;
  ● 一个XSL通常是静态地作用到一个XML文档上,无法将多个XML文档中的数据用一个XSL合并转换为一个输出结果。
 使用DOM就能够很好地解决上述问题,而且编写的脚本在服务器端和客户端都能够执行。在客户端可以根据情况创建友好的用户界面与用户进行交互,在服务器端使用脚本利用DOM可以按客户端的需求将数据进行组织并且发送。

 下面的这个例子就是把XML文档转换成HTML中的表格:
 Dim outstr
 outstr = "<TABLE BORDER=1>"
 Set listOrderitem = doc.selectNodes("//orderitem")
 For Each node In listOrderitem
 outstr = outstr & "<TR>" & _
 "<TD>" & node.getAttribute("title") & _
 "</TD>" & _
 "<TD>" & node.getAttribute("isbn") & _
 "</TD></TR>"
 Next
 outstr = outstr & "</TABLE>"
 下面的这个例子则是对XML数据进行数值运算,计算书本的平均售价:
 totalPrice = 0
 Set listPrice = doc.selectNodes("//price")
 For Each node In listPrice
 totalPrice = totalPrice + node.firstChild.nodevalue
 Next
 avgPrice = totalPrice / listPrice.length
 最后的这个例子显示了DOM 把多个XML文档合并转换显示的强大功能:
 <XML ID="dsoOrders" src="Orders.xml"></XML>
 <XML ID="dsoCustomers" src="Customers.xml"></XML>
 Set docOrders = dsoOrders.XMLDocument
 Set docCustomers = dsoCustomers.XMLDocument
 outstr = "<P>Number of order items: " & _
 docOrders.selectNodes("//orderitem").length & _
 "<P>Number of customers: " & _
 docCustomers.selectNodes("//customer").length  
 
 


--  作者:sharpdo
--  发布时间:1/14/2006 10:42:00 PM

--  
请大家看看问题到底出现在哪啊,我实在没有办法找出来,先谢谢大家的帮忙!

文件:test.htm
=============
<html>
<head>

<title>Test</title>
<script type="text/javascript" language="javascript">

    var http_request = false;
 
    function makeRequest(url) {

        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        http_request.onreadystatechange = alertContents;
        http_request.open('GET', url, true);
        http_request.send(null);

    }

    function alertContents() {

        if (http_request.readyState == 4) {
            if (http_request.status == 200) {

//出现错误区开始 [注意:如果将下列代码换成:alert(http_request.responseText); 则一切正常
]
 var res=http_request.responseXML.documentElement;
               var typex = res.getElementsByTagName('iva')[0].firstchild.data; 
   
//出现错误区结束,运行后,总是提示上述代码错误,如果将上述代码直接改为:alert(http_request.responseXML.xml),则系统没有提示错误,但返回的提示框无任何内容,即为空的提示框。诚恳各位XML爱好者帮帮忙,真的谢谢你们了!!!!


            } else {
                alert('There was a problem with the request.');
            }
        }

    }
</script>

</head>

<body>

    <input type="text" id="hr_code">
  
  <p>
    <input type="button" id="xxx" value="执行 " onclick="makeRequest('test.xml')">
  </p>
  <div id="iva_list"></div>
  
</body>
</html>


文件:test.xml与上述文件位于同一目录下
===============================
  <?xml version="1.0" ?>
- <iva_info>
  <iva>aaa</iva>
  <iva>bbb</iva>
  <iva>ccc</iva>
  <iva>ggg</iva>
  <iva>ffff</iva>
  </iva_info>


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
62.500ms