




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
金桥软件工程师教育系列教程XML教程AURISOFT的基础知识XM(eXtensible Markup Language,可扩展标记语言)是一种可扩展性的标记语言,主要用来存储和发送数据信息,以便在各种基于Web的应用程序之间能够更方便地交换数据,它正逐渐成为互联网上进行数据交换的主要方式和主要标准。JSP作为服务器端的动态页面设计语言非常适合与协同工作,它可以解析,转换和存取文档中的数据,特别是作为Java软件环境的一部分,JSP页面可以利用Java来处理XML中存储的各种数据对象,在开发动态网站时,将JSP与结合起来协同工作能大加强动态网站中信息交互的速度和效率。文件的基本结构和语法booklist.xml Java网络程序设计 张三 李四 35.0 JSP动态网页设计 王五 38.0(1)XML文件的基本结构文件的结构和文件十分相似,不过XML文件的结构要比文件中多样化,因为XML允许自己定义标记,还允许自行定义文件所需的结构,它实际上是一种树状结构的文件。上面这份XML文件是一份图书产品目录(booklist)的文件,它拥有多本书的(book)的数据,每一本书都拥有下列的基本目录图书编号(id):用于区分图书的编号图书的名称(title):图书的名称作者列表(authorlist):图书的作者列表,作者列表为此图书的作者,可能只有一位,也可能有很多位图书价格(price):图书的定价()文件的声明第一行就是XML文件的声明,它定义XML文件的版本和使用的字符集,此例遵循 xml1.0版本规范,使用中文的2312字符。( 2 )根标记第三行为xml文件的根标记,这是XML树状结构的根结点。XML文件必须要有根标记(3)子元素接下来就是根元素的两个子元素book,每个book子元素有一个属性id,其下又分别有title、authorlist、和price三个子元素,其中子元素authorlist下还有author子元素。(4)根元素结束标记 最后一行为根元素的结束标记通常,一个XML文件的基本结构就由这四个部分组成2)XML文件的语法 XML文件是由元素所组成的,一个完整的元素由开始标记,结束标记和其中的内容所构成,其语法形式为起始和结束标记。起始标记用字符定义,结束标记用定义。content 空元素标记。空元素标记用于表明元素不包含任何数据。使用字符来指定空元素标记。注释。xml中的注释在字符之间指定。我们再写一个简单一点地game.xml文件 XML Invaders A Node in the XPath XPath RacersJava很好的支持了XML应用程序的开发,目前提供了数个扩展API用来建立XML的应用程序,我们常用到是JAXP它所提供的类和方法可以让Java应用程序解析或转换XML文件,JAXP中主要的API包有:Javax.xml.parsers:提供解析XML文件的类Org.xml.sax:这是SAX解析器,提供以事件驱动的方解析XML文件的APIOrg.xml.saxhelpers: 提供解析错误处理的相关类,可以帮助程序设计者使用SAX API。Org.w3c.dom:提供支持DOM建议规格的API包XML的DOM接口XML DOM是一个文档对象组成的模型,属于XML文件程序设计接口对象,这个对象模型将XML文件视为树状结构,它提供各种应用程序标准设计接口的属性、方法和对象。通过XML DOM,程序设计者能够浏览XML文件,新增、删除和修改结点的数据。XMLDOM是一个与语言无关的接口,应用程序通过这个接口与XML内的数据打交道。XML解析器在加载XML文件之后,DOM将XML文件视为树状结构,将其中的元素视为树状结构和结点树,XML文件常见的结点种类结点类型举例NODE_PROCESSING_INSTRUCTIONNODE_ELEMENTJSP动态网页设计NODE_ATTRIBUTEid=1NODE_TEXTjsp动态网页设计下面我们来学习7个最主要的DOM接口。接口说明org.w3c.dom.Node表示DOM中主要的数据类型org.w3c.dom.Nodelist表示一个结点集合org.w3c.dom.Document表示一个完整的XML文档org.w3c.dom.Element表示XML文档中的一个元素org.w3c.dom.Attr表示元素的某个属性org.w3c.dom.Text表示字符数据org.w3c.dom.NamedNodeMap表示一个可以由名称引用的结点集合org.w3c.dom.NodeNode(结点)接口表示XML文档中的基本数据类型。其它接口(比如Document,Element和Attr)由这个接口扩展而来,而且他们中的大多数功能都来自于Node接口。在功能上尽可能使用Node接口处理DOM。也就是说,作为Node可以访问XML文档的任何组件。下面来看一下Node接口的一些方法。方法说明Node appendChild(Node child)在该结点的子结点列表末尾添加一个新的子结点Node cloneNode(boolean depth)返回该结点的一个副本NameNodeMap getAttributes()如果结点是一个元素,则返回该结点的属性之一NodeList getChildNodes()返回该结点的所有子结点的NodeListNode getFirstChild()返回该结点的第一个子结点Node getLastChild()返回该结点的最后一个结点Node getNextSibling()返回紧接在该结点后面的结点Node getNodeName返回该结点的名称String getNodeValue()依据结点类型的不同返回该结点的值int getNodeType()返回该结点的类型Document getOwnerDocument()返回该结点相关的Document对象Node getParentNode()返回该结点的父结点Node getPrevioiusSibling()返回该结点前面的结点boolean has Attribute()根据结点是否含有属性相应返回值true或falseboolean hasChildNodes()根据结点是否含有子结点相应返回值true或falseNode removeChild(Node oldChild)删除指定的子结点并返回该子结点Node replaceChild(Node newChild,Node oldChild)用指定的结点替换该子结点并返回原来的那个子结点void setNodeValue(String value)设置该结点的值Node接口的这些方法是DOM功能的核心。看下面这个例子: getChildNodes 可以用于获得根元素的子结点的NodeList CS 仙剑奇侠传 getNodeValue可以用于获得元素的genre属性或文本值 getAttributes可以用于获得 game元素的属性org.w3c.dom.NodeListNodeList(结点列表)接口表示结点的列表。通常,该接口用于处理元素集合,这些元素集合可能从某些类型的查询操作中返回,也能从getElementByTagName的Document或Element接口返回。而且,从方法getChildNodes中也将返回NodeList。方法说明int getLength()返回表示列表中结点数目的数字Node item()返回列表中的一项NodeList接口只包含两种方法:一种方法是得到列表中的结点数,另一种方法是访问列表中某个特殊结点。这样就形成了便利列表中的结点和检索其中的每一个结点的常用模式,举例如下:/ 首先我们假设aNode是被定义过了的Node类型对象NodeList children = aNode.getChildNodes();for(int i=0;iaNode.getLength();i+) Node iNode = children.item(i); System.out.println(“Node Name: ”+ iNode.getNodeName(); System.out.println(“Node Value: ”+ iNode.getNodeValue();org.w3c.dom.Document除了Node接口,Document(文档)接口大概是Dom中最有名的接口。该接口表示一个完整地XML文档并包含一些方法,使用这些方法可以创建标记和元素,也可以访问现有XML文档的元素和属性。方法说明Attr createAttribute(String name)用给定的名称创建一个属性AttrText createTextNode(String data)创建一个文本结点Element createElement(String tagName)创建一个元素(Element)Element getDocumentElement()提供使用文档根元素的权限NodeList getElementByTagName(String tagName)按照元素在文档中出现的次序返回包含所有子孙元素结点列表(NodeList)通常,调用负责创建文档实例的factory类将返回Document接口的new实例。解析文档后,向解析器请求该文档就可以创建Document实例。通常,代码类似下面的例子:DOMParser parser = new DOMParser();parser.paser(“booklist.xml”); Document dom = paser.getDocument();org.w3c.dom.Element接下来,比较知名的接口就是Element(元素)接口。Element接口表示XML文档中的一个元素。有时,从头创建元素是可以使用Element接口,例如下面的的例子所示Element root = dom.createElement(“games”);或者也可以在迭代Nodes的列表时使用Element接口,如下所示:NodeList children = aNode.getChildNodes();for(int i=0;iaNode.getLength();i+)Element iNode = (Element)children.item(i);例如,如果希望得到元素game的ganre属性值,可以使用Node接口,代码如下:iNode.getAttribute(“genre”);这样的代码比刚才使用Node接口的代码的确更直观、更方便读取并且更容易理解。Element接口的方法方法说明String getAttribute(String name)使用属性名称返回一个属性值Attr getAttributeNode(String name)使用属性的名称返回一个属性结点Nodelist getElementsByTagName(String name)按照元素在文档中出现的顺序返回一个包含所有子孙元素的结点列表(NodeList)String getTagName()返回元素的名称boolean hasAttribute(String name)根据指定名城的元素是否有属性返回true或falsevoid removeAttribute(String name)删除指定名称的属性Attr removeAttributeNode(Attr oldAttr)删除指定名称的属性结点,返回被删除的属性void setAttribute(String name,String value)使用指定的名称和值添加一个新的属性Attr setAttributeNode(Attr newAttr)使用提供的对象添加一个新的属性,返回最新添加的属性的一个实例org.w3c.dom.AttrAttr(属性)接口用于处理元素的属性。例如我们上边的例子里面的使用Document接口的createAttribute方法可以创建不附加在元素上的属性。采用Attr参数类型的Element接口的setAttribute方法可以添加createAttribute。方法说明String getName()返回该属性的名称Element getOwnerElement()返回附加于该属性的元素boolean getSpecified()如果在最初的xml文档中明确地赋予了属性的值,则返回trueString getValue()返回属性的值void setValue(String value)设置属性的值org.w3c.dom.TextText(文本)接口表示XML文档中的字符数据。不像Document和Element接口,Text接口并不是直接由Node接口扩展,相反,它是由CharacterData(字符数据)接口扩展而来,而CharacterData接口由Node接口扩展而来。因此,Text接口继承的方法与Document和Element接口相同。方法说明Text splitText(int offset)将文本结点分成两个文本结点并将它们作为兄弟结点放入结点树中org.w3c.dom.NamedNodeMapNameNodeMap接口表示可以有名称引用的结点的集合。这种接口的实现用于访问元素的属性列表。方法说明int getLength()返回该映射中的结点数目Node getNamedItem(String name)检索指定名称的结点Node item(int index)检索指定索引的结点Node removeNameItem(String name)删除制定名称的结点Node setNameItem(Node attrNode)使用结点名称属性添加结点JAXP类首先介绍解析XML所需的几种类,所有这些类都在javax.xml.parsers软件包中:DocumentBuilderFactory;方法说明static DocumentBuilderFactory newInstance()返回一个DocumentBuilderFactory对象void setIgnoringComments(booleanComments)设置忽略注释void void setIgnoringElementContentWhitespace(boolean Whitespace)设置忽略空格abstract DocumentBuilder newDocumentBuilder()返回一个DocumentBuilder对象DocumentBuilder;方法说明public Document parse(Filef)解析一个给定的xml文件内容,并且返回DOM Document 对象下面我们来看一个完整的例子,来看一下我们是怎么解析一个xml文件的ListDOM.java import javax.xml.parsers.*;import org.xml.sax.*; import java.io.*;import org.w3c.dom.*;public class ListDOM /声明XML文件 static Document document; public static void main(String args) throws Exception DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); / 设定解析的叁数 dbf.setIgnoringComments(true); dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db = dbf.newDocumentBuilder(); /导入XML文件 document = db.parse(new File(booklist.xml); / 获取根元素 Node root = document.getDocumentElement(); System.out.println(根元素: + root.getNodeName(); NodeList nodes = root.getChildNodes(); / 获取所有的子结点 for (int i=0; i nodes.getLength(); i+) / 元素和文字结点 System.out.println(元素: + nodes.item(i).getNodeName(); if (nodes.item(i).hasChildNodes() NodeList childs = nodes.item(i).getChildNodes(); / 显示所有子结点 for (int j=0; j childs.getLength(); j+) int type1 = childs.item(j).getNodeType(); /判断结点是不是一个元素类型 if (type1 = Node.ELEMENT_NODE) System.out.print( +- + childs.item(j).getNodeName(); System.out.println(/ + childs.item(j).getFirstChild().getNodeValue(); NodeList grandchilds = childs.item(j).getChildNodes(); for (int k=0; k grandchilds.getLength(); k+) int type2 = grandchilds.item(k).getNodeType(); if (type2 = Node.ELEMENT_NODE) System.out.print( +- + grandchilds.item(k).getNodeName(); System.out.println(/+grandchilds.item(k).getFirstChild().getNodeValue(); / 显示指定元素的属性值 NodeList tagNodes = document.getElementsByTagName(book); for (int i=0; i tagNodes.getLength(); i+) System.out.println(book( + i + ):); NamedNodeMap atts = tagNodes.item(i).getAttributes(); for (int j = 0; j atts.getLength(); j+) Node att = atts.item(j); System.out.print( +- + att.getNodeName(); System.out.println(/ + att.getNodeValue(); Add_DelXML.java import javax.xml.parsers.*;import org.xml.sax.*; import java.io.*;import org.w3c.dom.*;public class Add_DelXML / 声明XML文件 static Document document; public static void main(String args) throws Exception DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); / 设定解析的叁数 dbf.setIgnoringComments(true); dbf.setIgnoringElementContentWhitespace(true); DocumentBuilder db = dbf.newDocumentBuilder(); / 建立新XML文件 document = db.newDocument(); / 建立根元素 Element root = (Element) document.createElement(book); document.appendChild(root); / 新增子元素price Element temp = (Element) document.createElement(price); root.appendChild(temp); temp.appendChild(document.createTextNode(38); / 新增子元素title temp = (Element) document.createElement(title); root.appendChild(temp); temp.appendChild(document.createTextNode(JSP动态网页设计); / 新增author元素 Element newNode = (Element) document.createElement(author); root.insertBefore(newNode, root.getFirstChild(); Node newText = document.createTextNode(王五); root.getFirstChild().appendChild(newText); / 新增属性 temp = (Element) root.getElementsByTagName(price).item(0); temp.setAttribute(sale,Y); System.out.println(建立的XML文件: ); printXML(root); / 删除author元素 root.removeChild(Element) root.getElementsByTagName(author).item(0); / 删除price属性sale Element delNode=(Element) root.getElementsByTagName(price).item(0); delNode.removeAttribute(sale); System.out.println(n删除后的XML文件: ); printXML(root); private static void printXML(Node root) / 显示XML文件 System.out.println(根元素: + root.getNodeName(); NodeList nodes = root.getChildNodes(); / 获取所有的子结点 for (int i=0; i nodes.getLength(); i+) / 元素和文字结点 System.out.print(元素: + nodes.item(i).getNodeName(); System.out.println(/ + nodes.item(i).getFirstChild().getNodeValue(); / 显示指定元素的属性值 if (nodes.item(i).hasAttributes() NamedNodeMap atts = nodes.item(i).getAttributes(); for (int j = 0; j atts.getLength(); j+) Node att = atts.item(j); System.out.print( +- + att.getNodeName(); System.out.println(/ + att.getNodeValue(); XML的SAX接口SAX是一组程序设计接口,它将XML文件视为一个文字流的数据,在读取XML元素时触发一系列的事件,只需编写事件处理程序就可以获取XML元素的内容。如果说使用DOM时是将XML文件解析为一个树状结构,并对树中的结点进行操作,那么当使用SAX加载XML时,它的操作犹如打开一个“顺序的文件字符流”,在读到XML元素的开始标记、结尾标记和内容时将产生一系列的事件。例如一个很简单的XML文件:你好,XML这一段内容分为5个部分,分别是XML文件的开始,元素的开始标记,元素的内容,元素的结尾标记和XML文件的结束。在使用SAX读取这个XML文件时,会相应地依次触发下面这一系列事件:startDoument、startElement、characters、endElement、endDocument我们只需编写这些事件的处理程序,就可以在读取XML文件进操作所需的元素了。SAX技术使用了完全不同的DOM技术的方法来解析XML文件,用它来开发应用程序能够高效地使用内存,因为SAX只是顺序读取XML文件的内容,并不会将XML文件完全加载,这样就比DOM效率更高。当然,SAX技术在使用上也有一些缺陷,如SAX只能读取XML的内容,而不能更改XML文件的内容,也不能随机访问的XML元素。JAXP API提供了SAX API,可以使用Java建立SAX应用程序,这首先要导入相关的开发包:Import javax.xml.parsers.*Import org.xml.sax.*;Import org.sax.helpers.*;上述代码导入SAX应用程序所需的API包,然后就需要将主类直接继承DefaultHandler接口,接口DefaultHandler是一个基类,它提供了使用SAX方法读取XML文件时的几个事件处理函数 startDocument()、startElement()、characters()、endElement()和endDocument(),因此要将程序的主类继承DefaultHandler接口,以在主类中实现这个几个事件处理函数来解析XML文件。在Java的主程序中则需要创建SAXParseFactory对象,可以通过这个对象构建一个SAX的解析器对象SAXParser,如下所示:SAXParserFactory spf=SAXParserFactory.newInsstance();spf.setValidating(false);上述代码在建立对象后设定XML文件不需要验证,这是因为XML文件的语法的结构需要相应的验证机制验证语法是符合规范,这里我们认为所要处理的XML文件的语法结构正确的,也就不需要验证了,接着可以建立SAXParser对象,以便获取XMLReader接口对象,SAXParser saxParser=spf.newSAXParser();XMLReader xmlReader=saxParser.getXMLReader();XMLReader 接口对象用来设置和查询SAX解析器中属性和事件句柄,并初始化SAX解析器,还可用其方法parser对XML文件进行解析,在使用getXMLReader方法获取XMLReader接口对象后,要指定XMLReader对象使用的ContentHandler和ErrorHandler,xmlReader.setContentHandler(new SAXTagCount();xmlReader.setErrorHandler(new MyErrorHandler();以上代码指定ContentHandler为类本身,然后指定ErrorHandler(这是对解析中发生的异常事件和错误进行处理的一个类)对象,最后我们可以读取XML文件,如下所示String filename=convertToURL(booklist.xml);以下代码使用convertToURL方法将XML文件名称booklist.xml转换为URL网址的形式,例如:booklist.xml就转换成这样的URL网址:file:/c:/Tomcat5.0.28/webapps/parseXML/booklist.xml,这是因为对象XMLReader使用parse方法解析XML文件要使用URL网址型的XML文件名作为其接收参数。由此,使用SAX技术解析XML文件的流程可归纳如下:1. 将主类继承DefaultHandler接口2. 实现startDocument(),startElement(),characters(),endElement()和endDocument()这几个事件处理函数3. 在主程序中建立SAXParseFactory对象,并设定XML文件不需要验证。4. 建立SAXParser对象,获取XMLReader接口对象。5. 调用XMLReader对象的setContentHandler方法和setErrorHandler方法。6. 将XML文件名用方法convertToURL转换为URL网址的形式工,调用XMLReader对象的parse方法对XML文件进行解析。我们用一个例子来看SAX是解析的。这个例子只涉及接收XML文档内容出现的事件的通知。有两种方法可以创建内容处理程序。第一种方法是创建一个类并实现ContentHandler接口,这需要实现ContentHandler接口的所有方法。对于某些情况而言,使用这种方法已经足够了,但是对于其他可能对接受其他事件不感兴趣的情况就不足以应付了。第二种方法需要扩展DefaultHandler类并只需要重载感兴趣的方法。前面讲过DefaultHandler类实现4种事件处理程序:EntityResolver,ErrorHandler,ContentHandler和DTDHandler。EventHandler.java package xmlText;import org.xml.sax.Attributes;import org.xml.sax.helpers.DefaultHandler;public class EventHandler extends DefaultHandlerpublic void characters(char ch,int start,int length)System.out.println(new String(ch,start,length);public void endDocument()System.out.println(end of document);public void startDocument()System.out.println(start of document);public void endElement(String nameSpaceURI,String name,String qName)System.out.println(End of Element +qName);public void startElement(String namespaceURI,String name,String qName,Attributes atts)System.out.println(Start of Element +qName);在这个类中,重载了characters,endDocument,startDocument,endElement和startElement这几种方法。由此为处理简单的XML文档提供足够的信息。将该类保存到名为EventHandler.java的文件中,此文件与该应用程序的框架放在同一个目录中。解析文档,正如这一章前面所述的DOM例子,还需要解析该XML文档。下面的例子说明了如何使用SAX和已经创建的EventHandler解析XML文档。import java.io.FileInputStream;import org.apache.xerces.parsers.SAXParser;import org.xml.sax.InputSource;public class SAXExample public static void main(String args) trySAXParser sax = new SAXParser();sax.setContentHandler(new EventHandler();sax.parse(new InputSource(new FileInputStream(c:/JavaCode/xmlText/booklist.xml); catch (Exception ex)System.out.println(ex); 在这个例子里面,我们调用了SAXParser的parser()方法,这里我们给了一个绝对路径,我们再来看看,给一个URL的代码。package xmlText;import java.io.File;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.XMLReader;public class SAXSample2 public static void main(String args) throws ExceptionSAXParserFactory spf = SAXParserFactory.newInstance();XMLReader xmlReader = null;SAXParser saxParser = spf.newSAXParser();xmlReader = saxParser.getXMLReader();xmlReader.setContentHandler(new EventHandle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源汽车动力电池核心技术突破与应用前景报告
- 2025年工业污染场地修复技术优化与成本效益研究报告
- 2025年房地产数字化营销效果监测与优化策略报告
- 2025年电动汽车电池热管理技术热管理系统节能降耗创新报告
- 自家民宿出租合同范本
- 琴行合作入驻合同范本
- 类似卖身契约合同范本
- 签订电子送达协议合同
- 网络公司商城合同范本
- 自建冷库租赁合同范本
- DBJ43-T302-2025《住宅工程质量常见问题防治技术标准》
- 社会工作行政(第三版)课件全套 时立荣 第1-11章 社会服务机构- 社会工作行政的挑战、变革与数字化发展
- 《走近科学家》课件
- 《基础护理学(第七版)》考前强化模拟练习试题库500题(含答案)
- 小学数学与科学素养的融合教育
- 4.3 海-气相互作用课件【知识精研】高二上学期地理鲁教版(2019)选择性必修1
- 苏科版九年级上册数学第一次月考试卷附答案
- 全套55讲-鱼C论坛小甲鱼Python课后题-20211129034856
- 浙江省温州市“摇篮杯”2022-2023学年高一下学期化学竞赛试卷 含解析
- 24年追觅在线测评28题及答案
- 部编版二年级语文上册《植物妈妈有办法》教学课件2篇21
评论
0/150
提交评论