• 1. 第2章 使用DOM解析XML文档
  • 2. 课程回顾一个XML文档由5部分构成:元素、属性、实体、CDATA、PCDATA DTD使用一系列合法的元素来定义文档的结构,其主要使用的标记如下 定义文档的类型 定义文档元素 定义文档的属性 定义实体 XML Schema相比DTD具有以下优点 支持更丰富的数据类型 可针对未来的需求进行扩展 比DTD更完善,功能更强大 基于 XML 编写,比DTD语法更简单 支持命名空间 所有XML Schema的根元素都是,外部schema以.xsd文件为后缀名 XML Schema使用定义简单类型 XML Schema使用定义复杂类型
  • 3. 本章内容文档对象模型 节点和节点树 使用DOM加载XML文档 使用DOM访问、创建和修改节点
  • 4. 本章目标理解文档对象模型 理解节点和节点树 能够使用JavaScript语言和Java语言解析XML文档 加载文档 添加节点 删除节点 修改节点 替换节点 复制节点
  • 5. 1. DOM及其模型 1.1 DOM简介 DOM(文档对象模型)定义了访问诸如 XML 和 XHTML 文档的标准 XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法(接口) XML文档XML解析器DOM树应用程序检查文档是否格式良好加载文档并创建节点树通过标准接口访问文档
  • 6. DOM简介DOM级别(规范)DOM级别指W3C组织的DOM规范,W3C组织为DOM规范定义了3个级别 DOM 级别 1 DOM 级别 2 DOM 级别 3
  • 7. 1.2 节点和节点树 依据DOM的规定,XML文档中每一个单元都是节点 整个文档是一个文档节点 每个 XML 标签是一个元素节点 包含在 XML 元素中的文本是文本节点 每一个 XML 属性是一个属性节点 注释属于注释节点XML DOM 将XML 文档视为一种树结构
  • 8. 节点和节点树 节点之间的关系 在节点树中,顶端的节点成为根节点 根节点之外的每个节点都有一个父节点 节点可以有任何数量的子节点 叶节点是没有子节点的节点 同级节点是拥有相同父节点的节点使用DOM可以在不了解节点树的确切结构且不了解其中包含的数据类型的情况下,对其进行遍历
  • 9. 小结XML DOM是什么? 节点树的节点之间有哪几种关系?
  • 10. 2. DOM编程接口 2.1 XML DOM 对象 XML DOM对象中封装了常用的操作XML文档的属性和方法 XML DOM Attr 对象:表示 Element 对象的属性 XML DOM CDATASection 对象:表示文档中的 CDATA 段 XML DOM Comment 对象:表示文档中注释节点的内容 XML DOM Document 对象:表示整个 XML 文档 XML DOM DOMParser 对象:该对象通过解析XML 标记来创建一个文档 XML DOM Element 对象:表示 XML 文档中的元素 XML DOM NamedNodeMap 对象:表示一个无序的节点列表 XML DOM Node 对象:表示文档树中的一个节点 XML DOM NodeList 对象:表示一个有序的节点列表 XML DOM Text 对象:表示元素或属性的文本内容 XML DOM XMLHttpRequest 对象
  • 11. 2.2 加载XML文档 使用load()方法加载XML文档 xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("books.xml");IE浏览器 xmlDoc=document.implementation.createDocument("","",null); xmlDoc.async="false"; xmlDoc.load("books.xml");Firefox、Mozilla、Opera等浏览器 try{ xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); } catch(e){ try{ xmlDoc=document.implementation.createDocument("","",null); } catch(e) {alert(e.message)} } try{ xmlDoc.async=false; xmlDoc.load("books.xml"); }兼容IE和FireFox浏览器
  • 12. 加载XML文档 使用load()方法加载XML文档 public void loadXmlDom() throws ParserConfigurationException, SAXException, IOException{ //查找工程相对目录下的XML文件 File f = new File("WebRoot/WEB-INF/classes/books.xml"); DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); org.w3c.dom.Document doc = builder.parse(f); System.out.println("XML文档加载完毕,节点树已经创建,可以进行解析了"); } 使用Java的方式加载XML文档
  • 13. 加载XML文档 loadXml()方法加载XML字符串 xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(text);IE浏览器 parser=new DOMParser(); xmlDoc=parser.parseFromString(text,"text/xml");FireFox浏览器 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); InputStream input = new ByteArrayInputStream(text.getBytes()); org.w3c.dom.Document doc = builder.parse(input); System.out.println("XML文档加载完毕,节点树已经创建,可以进行解析了");Java语言加载XML字符串
  • 14. 2.3 节点操作 属性说明nodeName获取节点名称nodeValue获取节点的值parentNode获取节点的父节点childNodes获取节点的所有子节点集合attributes获取当前节点所有的属性节点documentElement获取文档的根节点节点操作是通过XML DOM对象的属性和方法来实现方法说明getElementsByTagName(name)获取带有指定标签名(name)称的所有元素createElement(name)创建指定标签名称的元素节点appendChild(node)向调用节点末尾插入子节点noderemoveChild(node)从调用节点中删除子节点node
  • 15. 节点操作 访问节点 访问节点包括遍历节点、定位某个节点、获取节点详细信息等操作XmlNode代表一个节点。常用属性如下 nodeName nodeType nodeValue XmlNodeList代表一个节点集合。常用属性如下 length
  • 16. 节点操作 访问节点 可以通过3种方法来访问节点 通过使用 getElementsByTagName() 方法 通过循环(遍历)节点树 通过利用节点的关系在节点树中导航属性功能parentNode获取父节点childNodes获取子节点集合firstChild获取第1个子节点lastChild获取最后一个子节点nextSibling获取同级别中后一个节点previousSibling获取同级别中前一个节点节点之间的关系
  • 17. 节点操作访问节点 var nlist=xmlDoc.getElementsByTagName("book")[0].childNodes; var node=xmlDoc.getElementsByTagName("book")[0].firstChild; for (var i=0;i元素"+node.nodeName+"有属性"+att[i].nodeName+"="+att[i].nodeValue); } document.write("
    "); node=node.nextSibling; }遍历第1个book元素的所有子节点 输出每个属性节点的值 将当前节点的同级下个节点作为操作节点JavaScript实现DOM访问节点
  • 18. 节点操作Java实现DOM访问节点 NodeList bookList = doc.getElementsByTagName("book"); int size = bookList.item(0).getChildNodes().getLength(); for(int i=0;i19. 节点操作创建节点 方法名功能createElement(name)创建一个元素节点appendChild(node)在当前节点中追加一个子节点createAttribute(name)创建一个属性节点setAttributeNode(att_node)将属性节点添加到一个元素节点中setAttribute(name,value)为一个元素创建一个新的属性节点createTextNode(data)创建一个文本节点createCDATAsection(data)创建 CDATA节点createComment(data)创建一个注释节点insertBefore(newNode,refNode)在指定的子节点之前插入节点insertAfter(newNode,refNode)在指定的子节点之后插入节点insertData(offset,string)将数据插入已有的文本节点中
  • 20. 节点操作创建节点 var ele = xmlDoc.createElement("publish"); var att = xmlDoc.createAttribute("pubdate"); att.nodeValue = "2008-1-9"; ele.setAttributeNode(att); var node=xmlDoc.getElementsByTagName("book")[0]; node.appendChild(ele);创建新的元素节点创建新的属性节点将属性节点添加到元素节点中将元素ele添加到node的子元素末尾
  • 21. 节点操作Java实现DOM创建节点 Element root = doc.getDocumentElement(); Element publish=doc.createElement("publish"); publish.setAttribute("pubdate", "2008-1-9"); doc.getElementsByTagName("book").item(0).appendChild(publish);Java实现DOM创建节点
  • 22. 节点操作修改节点的值var fNode = xmlDoc.getElementsByTagName("book")[0]; var sNode = fNode.childNodes[0]; fNode.setAttribute("category", "Novel"); var attNode = sNode.getAttributeNode("lang"); attNode.nodeValue = "zh-cn"; sNode = sNode.nextSibling; sNode.childNodes[0].nodeValue = "王蒙";修改book元素的属性category的值 改变文本节点的nodeValue属性就修改了文本节点和属性节点的值,也通过setAttribute()方法修改属性的值修改属性lang的值 修改文本节点的值
  • 23. 节点操作Element bookEle=(Element)bookList.item(0); bookEle.setAttribute("category", "Novel");Java实现DOM修改节点的值
  • 24. 节点操作var fNode=xmlDoc.getElementsByTagName("book")[0]; xmlDoc.documentElement.removeChild(fNode); 删除节点常使用以下3个方法 removeChild(node):删除指定的节点 removeAttribute(name):根据名称删除指定的属性 removeAttributeNode(node):根据节点对象删除属性sNode.parentNode.removeChild(sNode);删除当前元素自身 fNode=xmlDoc.getElementsByTagName("author")[0]; fNode.removeChild(fNode.childNodes[0]);删除文本节点 fNode=xmlDoc.getElementsByTagName("title")[0]; fNode.removeAttribute("lang");根据属性名删除属性 fNode = xmlDoc.getElementsByTagName("title")[1]; fNode.removeAttributeNode(fNode.attributes[0]);依据属性节点删除属性 删除根元素的第1个子元素
  • 25. 节点操作var fNode=xmlDoc.getElementsByTagName("title")[0].childNodes[0]; fNode.replaceData(0,8,"Pe");将第1个title元素的文本Harry Potter替换成Petter替换节点常使用以下3个方法和属性 replaceChild(new_node,old_node) replaceData(start,length,string) nodeValue
  • 26. 节点操作复制节点var oldNode=xmlDoc.getElementsByTagName('book')[0]; var newNode=oldNode.cloneNode(true); xmlDoc.documentElement.appendChild(newNode);将第1个book元素复制出一个副本,保存到newNode中 使用cloneNode() 方法创建指定节点的副本
  • 27. 小结添加节点有哪几种方式? 如何获得当前节点的前一个节点? 如何为节点添加属性? 如何为文本节点赋值? 删除当前节点有哪几种方式?
  • 28. 总结文档对象模型(DOM)定义了访问诸如 XML 和 XHTML 文档的标准 W3C组织为DOM规范定义了3个级别 DOM级别1 DOM级别2 DOM级别3 XML文档中每一个单元(元素、属性、实体、备注等)都是节点 XML DOM 将 XML 文档视为一种树结构,即节点树。节点之间的关系有:父节点、子节点、同级节点、前一个节点和后一个节点 XML Document对象的load()方法用于加载XML文档,loadXML()方法用于加载XML字符串 XML DOM对象中常用的操作XML文档节点的方法和属性如下 getElementsByTagName() appendChild() insertBefore() cloneNode() createElement() removeChild() nodeType nodeValue nodeName
  • 29. (本页无文本内容)