




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章 XML与Java教学提示:一个单独的XML文件不能做任何的工作,它需要与应用程序结合来实现各种功能,应用程序通过XML解析器和XML应用程序接口处理XML文件。本章介绍了Java程序如何使用DOM解析XML文件。JAXP 提供的类和方法,可以让Java应用程序使用DOM解析或转换XML文件。教学要求:了解Java的特点,熟悉Java的开发环境JDK的安装和配置,掌握Java使用DOM加载XML的方法,掌握访问XML元素和属性的方法,掌握使用DOM创建XML文件的方法,学会转换XML文件为HTML的方法。10.3 Java程序加载XML文件10.4 Java程序中访问XML元素和属性10.5 Java程序中XML文件的转换小 结习 题10.3 Java程序加载XML文件 为了简化编写处理 XML 的 Java 程序,已经建立了多种编程接口。这些接口或者由公司定义,或者由标准体或用户组定义,以满足 XML 程序员的需要。以下列出了四种接口: Document Object Model(DOM,文档对象模型),Level 2 Simple API for XML (SAX), Version 2.0 JDOM, Jason Hunter 和 Brett McLaughlin 创立的一种简单 Java API Sun推出JAXB(Java Architecture for XML Binding) 这四种接口中DOM是W3C的正式推荐,本章主要介绍Java应用程序如何使用DOM解析或转换XML文件。要创建 DOM 或 SAX 解析器,需要使用 JAXP(Java API for XML Processing)。10.3.1 JAXP的简介 JAXP使得用Java语言开发处理XML数据的应用程序非常容易,JAXP包括词法分析器、标准SAX与DOM,可以选择以事件流或建立对象表示来解析数据。JAXP1.1版本还支持XSLT标准,可以控制数据的表示,并可以将数据转换成其它XML文件或其它格式,如HTML。JAXP还提供对名称空间的支持,可以在没有命名冲突的情况下使用DTD。JAXP 提供的类和方法,可以让Java应用程序使用DOM解析或转换XML文件,在JDK1.4支持的JAXP API 1.1版支持XML,建议规格DOM Level 2、XSLT 1.0和SAX 2.0。其解析文档对象模型的相关套件,如表12-1所示:表10-1 JAXP API 1.1解析文档对象模型的相关套件套 件说 明Javax.xml.parsers提供处理XML文件的类Javax.xml.transform提供处理XSLT文件的类org.xml.sax这是SAX解析器,提供以事件驱动方式解析XML文件的APIorg.xml.saxhelpers提供解析错误处理的相关类,可以帮助程序设计者使用SAXAPIOrg.w3c.dom提供支持DOM建议规格的套件10.3.2 常用的DOM接口DOM定义了一套标准的接口以便按照程序的设计显示XML文档。当然。DOM不是一种实现,支持DOM的XML解析器必须实现DOM所定义的接口。最常用的几个DOM接口对象可见第九章的表9-3所示,这里不再赘述。10.3.3 加载XML文档文件在Java程序中加载XML文档文件,步骤如下:1)首先需要导入相关的套件,如下所示:import javax.xml.parsers.*;import org.xml.sax.*;import org.w3c.dom.*;import java.io.*;其中org.xml.sax.*套件是解析错误处理的相关套件,此外因为XML文件属于文本文件,所以导入文件处理的套件import java.io.*。2)在JAXP中,DOM解析器称为“DocumentBulider”,可以通过工厂类DocumentBuliderFactory获得,而Document对象则可以通过类DocumentBulider获得,使用try catch指令建立解析的错误处理。在建立DocumentBulider对象后,可使用parser方法解析加载XML文件,这是一个File对象加载后就可以处理XML文件的节点内容。其程序块的架构如下所示:/获得一个XML文件的解析器DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();try/解析XML文件生成DOM文档的接口类,以便访问DOM DocumentBuilder db=dbf.newDocumentBuilder(); document=db.parser(new File(args0); . catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationExcepion pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStacktrack(); 3)获得接口类Document实例后,就可以对DOM的文档树进行访问。如要遍历DOM文档,首先要获得根节点,然后获得根节点的子节点列表。 /获得根节点Element element=document.getDocumentElement(); /获得根节点的子节点列表 Nodelist=element.getChildNodes();【例10.1】显示加载的外部XML文件所有节点的名称和值,code10_1.java,显示结果如图10.7。这里通过递归方法实现遍历的目的。import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_1static Document document;public static void main(String args) if(args.length!=1) System.out.println(加载xml file); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBuilder(); /读入XML文档 document=db.parse(new File(args0); /遍历XML文档 walkNode(document.getDocumentElement(); catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStackTrace(); private static void walkNode(Node anode) NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;ichild.getLength();i+) Node node=child.item(i); if(node.hasChildNodes() walkNode(node); else printNode(node); private static void printNode(Node anode) System.out.println(anode.getNodeName()+,+anode.getNodeValue(); 被引用的XML文件为code10_1.xml: cheaperget 12345678 200508 361021XX省XX市银江路108号 dreamingboy 22345678 200505 215006XX省XX市人民路616号 图10.7 例10.1运行结果本例中遍历了XML文档的所有节点,并显示出了所有节点的名称和值。从结果中可以看出有许多#text节点,其中一些是表示文本节点,如#text,cheaperget和#text,12345678;还有的表示XML文件中行与行之间的换行符和空格符,如customers,null后的#text就是XML文件中第二行与第三行之间的换行符和空格符。如何去掉这些多余的#text节点呢?我们可以把XML文档中的换行符和空格符去掉,再重新运行程序,将会发现这些多余的#text节点全都没有了。可是把XML文档中的换行符和空格符去掉后,XML可读性就非常差,怎样解决这个问题呢?我们可以在加载文件时并设定参数。10.3.4 设定加载XML文件的参数DocumentBuilderFactory类提供相关方法可以设定解析器解析XML文件的方式,例如:是否忽略文字或whitespace内容的元素等,如表10.2所示:表10.2 加载XML文件的参数方 法说 明setCoalesing(Boolen)设置解析器CDATA节点转换成TEXT文字节点和新增在其相邻文字节点之后(如果有的话),默认值为false,true表示转换setExpandEntityReferencedes(boolen)设置解析器展开实体参考的节点,默认值为true表示展开,false表示不展开setIgnoringComments(boolen)设置解析器忽略注释文字,默认值为false,true表示不忽略SetIgnoringElementContentWhitespace(boolen)设置解析器忽略元素内容为whitespace空白字节的节点,默认值为false,true表示忽略【例10.2】加载外部code10_2.xml文件(此XML文件拥有DTD文件),并设定解析器参数,然后显示所有节点的名称和值,code10_2.java,显示结果如图10.8。import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_2static Document document;public static void main(String args) if(args.length!=1) System.out.println(加载xml file); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try /设定解析参数 dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db=dbf.newDocumentBuilder(); /读入XML文档 document=db.parse(new File(args0); /遍历XML文档 walkNode(document.getDocumentElement(); catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStackTrace(); private static void walkNode(Node anode) NodeList child=anode.getChildNodes(); printNode(anode); for(int i=0;ichild.getLength();i+) Node node=child.item(i); if(node.hasChildNodes() walkNode(node); else printNode(node); private static void printNode(Node anode) System.out.println(anode.getNodeName()+,+anode.getNodeValue(); 图10.8 例10.2 运行结果被引用的XML文件为code10_2.xml cheaperget 12345678 200508 361021XX省XX市银江路108号 dreamingboy 22345678 200505 215006XX省XX市人民路616号 10.4 Java程序中访问XML元素和属性如果仔细分析例10.2的运算结果,会发现元素的属性没有显示出来,如何显示出元素的属性呢?从第九章的学习,我们知道DOM是由W3C制订的用于处理XML文件和HTML文件的API。在应用程序中,基于DOM的XML解析器将一个XML文档转换成一个类似于树的对象模型集合,通常称为DOM树。在这棵树中,包含了XML文档所有内容,并都用节点表示。首先来看一下XML文档常见的节点的种类,如表10-3所示:表10-3 XML文件节点种类节点类型说 明NODE_DOCUMENT_TYPENODE_PROCESSING_INSTRUCTIONNODE_ELEMENTcheapergetNODE_ATTRIBUTEID=c0500103NODE_TEXTcheaperget表中列出了节点种类的常数名称,当DOM加载XML文件后,Java程序代码看到的XML文件内容就是表中各种节点组成的一棵树状结构,而节点本身还可能包含一些信息,例如节点的名字、节点值、节点的类型等,因此DOM树中的节点是对象,对象包含方法与属性。下面我们就看如何使用节点的方法来访问节点的属性。 10.4.1 访问XML元素和属性上节例10.2中我们已经遍历了DOM树中的所有元素,如果仔细分析的运算结果,会发现元素的属性没有显示出来,如何显示出元素的属性以及访问元素呢?下面我们来进行详细讲解。在DOM接口规范中,有四个基本接口:Document、Node、NodeList、Element。在这四个基本接口中,Document接口是对文档进行操作的入口,它是从Node接口继承过来的。Node接口是其他大多数接口的父类,像Document、Element、Text、Comment等接口都是从Node接口继承过来的。NodeList接口是一个节点的集合,它包含了某个节点中的所有子节点。下面我们来对这几个接口分别做一些简单的介绍。1.Document接口Document接口代表了整个XML文档,因此,它是整个文档树的根,提供了对文档中的数据进行访问和操作的入口。通过Document节点,可以访问到文档中的其他节点,如处理指令、批注、文字等。方法描述:1)getDocumentElement() Document文件对象使用该方法可获取XML文件的根节点;2)getElementsByTagName() Document使用标记名获取子节点,取出的节点是一个NodeList对象。2.Node接口Node接口在整个DOM树中具有举足轻重的地位,DOM接口中很大一部分接口是从Node接口继承过来的,例如Document、Element、Text、Comment等接口,都是从Node接口继承过来的。在DOM树中,Node接口代表了树中的一个节点。方法列表:1)getChildNodes() 获取子节点的NodeList节点对象列表,即子节点数;2)getNodeName() 返回节点名称,不同节点种类的值不同;3)getNodeType() 返回节点种类的代码;4)getNodeValue() 返回节点的值;5)getFirstChild() 获取第一个子节点;6)getNextSibling() 获取此节点的兄弟节点,即同级的下一个节点;7)getLastChild() 获取最后一个子节点;8)getParentNode() 获取父节点;9)hasChildNodes() Node节点对象检查是否拥有子节点,是返回true,否则为false。3.NodeList接口NodeList接口提供了对节点集合的抽象定义,它并不包含如何实现这个节点集的定义。NodeList用于表示有顺序关系的一组节点,比如某个节点的子节点序列。NodeList中的每个item都可以通过一个索引来访问,该索引值从0开始。另外,它还出现在一些方法的返回值中,例如GetNodeByName。方法列表:1)getLength() 可获取NodeList对象共有多少节点,即节点的个数;2)item(int) 返回参数制定的节点对象,参数是节点对象的索引值。4.Element接口Element接口是从Node接口继承过来的,它代表了XML文档中的元素。Element接口提供了访问DOM树中元素内容与信息的途径,并给出了对DOM树中的元素进行遍历的支持。方法列表:1)getElementsByTagName(String) 通过标签名称获取元素;2)getTagName() 获取元素的标签的名称;3)getAttributes(String) 获取元素的属性,是属性对象列表,属于NamedNodeMap;4)getAttributeNode(String) 通过属性的名字得到一个属性类型节点。5NamedNodeMap属性列表对象NamedNodeMap对象可以获取元素的属性列表,因为一个元素可能拥有多个属性。可以使用getAttributes获取属性列表。下面我们通过一个实例来说明如何使用上述对象和方法来解析一个XML文档【例10.3】使用DOM对象和方法访问XML文件的元素与属性,code10_3.java。XML文件为code10_1.xml,显示结果如图10.9import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_3static Document document;public static void main(String args) if(args.length!=1) System.out.println(加载xml file); return; DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); try DocumentBuilder db=dbf.newDocumentBuilder(); /读入XML文档 document=db.parse(new File(args0); /获得根元素 Node root=document.getDocumentElement(); /获得根元素的子节点列表 NodeList childs=root.getChildNodes(); GetElement(childs); catch(SAXException se) /解析过程错误 Exception e=se; if(se.getException()!=null) e=se.getException(); e.printStackTrace(); catch(ParserConfigurationException pe) /解析器设定错误 pe.printStackTrace(); catch(IOException ie) /文件处理错误 ie.printStackTrace(); public static void GetElement(NodeList childs) int i=0; if(childs.getLength()=0) /该节点没有子节点 System.out.println(该节点没有子节点!); for(i=0;i0) System.out.println(txtName=+txtName+; txtValue=+txtValue.trim(); 图10.9 例10.3运行结果例题10.3使用循环显示了所有的子节点,如果需要访问特定的元素或属性,我们可以使用Document对象的getElementByTagName方法获取指定的XML元素。如获得password标记的第二个password标记,NodeList节点列表,如下所示:/获得password标记的NodeList节点列表Nodelist passwords=Document.getElementByTagName(“password”);/item方法指出为第二个password标记System.out.println(“元素名称:”+passwords.item(1).getNodeName();使用Node节点对象的getChildNodes方法可以在树状结构的节点中获取所需的子节点。/获取根节点root下一层的第二个节点的第二个子节点System.out.println(root.getChildNodes().item(1). getChildNodes().item(1).getNodeName(); 此外Node节点对象的getFirstChild()、getLastChild()、getNextSibiling()和getParentNode()等方法可获取指定的节点。10.4.2 使用DOM创建XML文档前面我们讲述了如何使用DOM访问XML文档,DOM还允许用户从头创建自己的XML文档。1)创建XML文档可以使用newDecument方法建立XML文档。Document=db.newDecument();2)建立新的节点使用Document对象的方法建立所需节点对象,如表10.4所示:表10.4 建立新节点的方法方 法说 明createElement(string)建立XML元素的节点,参数为标记名称createAttribute(string)建立属性名称的属性节点,参数是属性名称createCDATASection(string)建立CDATA块,参数是文字内容createComment(string)建立注释文字节点,参数为注释文字内容createTextNode(string)建立文字节点,参数为内容createEntityReference(string)建立实体参考,参数为实体参考名称createProcessingInstring(string,string)建立PI节点,第一个参数是PI名称,第二个为值3)指定插入的位置在建立好XML元素的对象后,可以使用Node节点对象的方法新增到DOM树中: appendChild(newnode) 新添加一个newnode节点; insertBefore(newnode,befnode) 将newnode节点插到befnode节点前。 4)新增元素内容使用createTextNode方法建立文字节点后,再使用appendChild方法将它新增到元素节点。5)新增元素的属性可以使用setAttribute方法给Element元素对象增加属性。6) 删除元素或属性如要删除节点可使用Node节点的removeChild方法删除指定的节点;如要删除属性可使用Element元素对象的removeAttribute 方法删除。/删除第一个customer节点root.removeChild(Element)root.getElementsBytagName(“customer”).item(0);/删除属性Element node=(Element)root.getFirstChild();Node.removeAttribute(“ID”)下面我们通过一个实例来进行说明:【例10.4】使用DOM对象创建XML文件,code10_4.java。显示结果如图10.10import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;import org.w3c.dom.*;public class code10_4 static Document document; public static void main(String args) throws Exception DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); DocumentBuilder db=dbf.newDocumentBuilder(); /建立新的XML文件 document=db.newDocument(); /建立根元素 Element root=(Element)document.createElement(customer); document.appendChild(root); /新增子元素customerID Element newnode=(Element)document.createElement(customerID); root.appendChild(newnode); /增加元素的内容 newnode.appendChild(document.createTextNode(ID); / 增加元素的属性 newnode=(Element)root.getFirstChild(); newnode.setAttribute(ID,c050013); /新增子元素username newnode=(Element)document.createElement(username); root.appendChild(newnode); /增加元素的内容 newnode.appendChild(document.createTextNode(cheaperget); /新增子元素password newnode=(Element)document.createElement(password); /新增元素插入在根元素的最后一个孩子前面 root.insertBefore(newnode,root.getLastChild(); /新建文字节点 Node text=document.createTextNode(12345678); /插入文字节点到根节点第一个子节点的兄弟节点,即第二子节点 Node temp=root.getFirstChild(); temp.getNextSibling().appendChild(text); /显示XML文件 System.out.println(根元素:+root.getNodeName(); /获取根元素的所有子节点 NodeList childs=root.getChildNodes(); for(int i=0;ichilds.getLength();i+) /显示元素的名字和元素的内容(文字节点) System.out.print(元素:+childs.item(i).getNodeName(); System.out.println(/+childs.item(i).getFirstChild().getNodeValue(); /显示元素的的属性值 if(childs.item(i).hasAttributes() /取属性列表 NamedNodeMap atts=childs.item(i).getAttributes(); /使用for循环获取各属性名称和值 for(int j=0;jatts.getLength();j+) Node att=atts.item(j); System.out.print(-+att.getNodeName(); System.out.println(/+att.getNodeValue(); 图10.10 例10.4的运行结果10.5 Java程序中XML文件的转换 到目前为止,我们重点在于使用Java对XML文档中的数据进行处理,而没有过多考虑如何在用户面前展示XML文档中的数据。本节我们将讨论如何使用Java将XML文档转换成HTML文件,这样就可以通过浏览器来显示XML文档数据。我们首先看一个例题:【例10.5】以XSLT Script转换XML文件为一个HTML文件。以第九章的code9_1.xml为例进行转换,转换结果为code10_5.html,程序为code10_5.java。import javax.xml.transform.*;import javax.xml.transform.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓储物流效率提升方案与案例分析
- 设备采购合同条款撰写规范
- 2025年涂装工(初级)涂装施工材料采购合同管理风险处置方案试题
- 于都新长征高级技工学校2025年公开招聘编制外教师考试参考题库及答案解析
- 2025四川省医学科学院四川省人民医院科研人员及实验技术人员招聘11人考试参考题库及答案解析
- 企业质量管理改进方案范文
- 2025浙江嘉兴市海宁市工联房地产开发有限公司下属单位招聘4人考试参考题库及答案解析
- 2025年河北承德市承德县高校毕业生临时公益性岗位招聘23人考试参考题库及答案解析
- 2025四川自贡市自流井区中医院招聘编外专业技术人员4人考试参考题库及答案解析
- 2025河北承德双桥区潘家沟街道办事处招聘公益岗1人考试参考题库及答案解析
- 人力资源知识竞赛题库及答案
- 地铁轨道安全培训报道课件
- 2025年征信题库及答案
- 传染病及其预防(第一课时)课件-2025-2026学年人教版生物八年级上册
- 2025年社工工作者考试真题及答案
- 同城理发店转租合同范本
- 医院反诈宣传课件
- 2025年日本n4试题及答案
- 2025年秋期人教版3年级上册数学核心素养教案(第2单元)(教学反思有内容+二次备课版)
- 2025乡村医生培训考试试题库及参考答案
- 智慧工业园区AI大模型数字化平台建设方案
评论
0/150
提交评论