xml 解析
1什么是解析器XML是保存数据的文件,XML中保存的数据也需要被程序读取然后使用。那么程序使用什么来读取XML文件中的数据呢?XML解析器!例如.properties文件的解析器是Properties类一样! XML不只被Java语言使用,还被C++、C#、Javascript等等语言使用,所以解析XML不是一门语言的工作! 2DOM和SAX介绍主流的XML解析有两种标准:DOM和SAX。它们是标准,是思想,不是真正的解析器,它们是跨语言的!!! lDOM(DocumentObjectModel):W3C组织提供的解析XML文档的标准接口; lSAX(SimpleAPIforXML):社区讨论的产物,是一种事实上的标准。 Apache的xerces组件实现了DOM和SAX,所以在我们在Java中解析XML需要使用xerces。所以我们称xerces是DOM、SAX解析器。 2.1DOM解析原理 DOM要求解析器把整个XML文档装载到一个Document对象中。即使用DOM解析器解析XML文档的结果就是一个Document对象。 一个XML文档解析后对应一个Document对象,可以通过Document对象获取根元素,然后在通过根元素获取根元素的子元素…,这说明DOM解析方式保留了元素之间的结构关系! l优点:元素与元素之间的结构关系保留了下来; l缺点:如果XML文档过大,那么把整个XML文档装载进内存,可能会出现内存溢出的现象! 2.2SAX解析原理 DOM解析后的结果是一个Document对象,而SAX解析没有结果!SAX要求在开始解析之前用户提供一个接口的实现对象,然后把接口实现对象传递给SAX解析器,然后在SAX解析器的过程中不调用实现对象的方法。 lDOM是解析时把数据放到了Document对象中,然后用户从Document中获取需要的数据; lSAX要求用户参与到解析过程中来,把想要做的事情写到接口实现对象中,然后SAX在解析过程中来调用接口实现对象的方法。 你看过三国么?听说过三气周瑜么?其中二气周瑜你知道么?故事情节大致如下: 倒霉的周瑜让孙权把自己的妹妹嫁给刘备,让刘备来吴国完婚!目的是把刘备软禁在吴国,或者把刘备干掉。如果刘备不同意,那么孙权就有了打刘备,抢荆州的借口了。 孔明识破了这一计,最终让刘备与赵云去吴国。但孔明给了赵云三个锦囊: l到了吴国南徐开第一个锦囊; l在吴国住到年终开第二个锦囊; l回家途中被吴军阻拦开第三个锦囊。 锦囊的内容是什么呢?赵云和刘备性命如何呢?诸葛亮又是如何二气周瑜的呢?这里没有了,自己去买本《三国演义》看吧! 其中赵云就是SAX解析器,赵负责去吴国,SAX负责解析XML; 其中孔明的三个锦囊就是接口实现中的三个方法; 赵云会在特定时刻打开锦囊,依计而行,SAX解析器会在解析过程中特定时刻调用接口实现中的某一方法。 取亲之旅?à被解析的XML 赵云?àSAX解析器 锦囊?à接口在三个方法(由我们完成) 赵云在取亲之旅中,会在发生特定事件时,执行特定的锦囊。例如在到达吴国南徐时,执行第一个锦囊上的妙计。 SAX解析器会在解析XML文档的过程中,在发生特定事件时,调用接口中特定的方法。例如在SAX解析到某个元素的开始标签时,输出元素名称!其中解析到开始标签就是特定的事件,而输出元素名称,就是接口中方法的实现。 接口中方法如下:
接口的实现由我们来完成,然后我们需要把接口实现类对象“交给”SAX解析器,然后让SAX开始解析。SAX会在特定事件发生时,调用接口中的方法,完成我们交给它的任务。 l优点:适合解析大XML文件(内存空间占用小),因为是解析一行处理一行,处理完了就不需要在保留数据了; l缺点:因为是解析一行处理一行,解析之后数据就丢失了,所以元素与元素之间的结构关系没有保留下来。 3JAXP介绍我们知道有很多像xerces一样的解析器,都对DOM和SAX提供了实现,那么如果我们在项目中一开始使用了解析A,然后因为某些原因想更换成解析B,那么就需要修改项目。 JAXP(JavaAPIforXMLProcessing)是由Java提供的,JAXP是对所有像xerces一样的解析的提供统一接口的API。 当我们使用JAXP完成解析工作时,还需要为JAXP指定xerces或其他解析器,当需要更换解析器时,无需修改代码,只需要修改配置即可。 JAXP不是解析器,但使用它可以方便的切换解析器。所以在我们的程序中只会使用JAXP,而不会直接使用Xeces。 4JDOM和DOM4j介绍DOM和SAX是跨语言的XML解析准备,在Java中使用并不方便。而JDOM和DOM4j是专门为Java语言提供的解析工具!使用起来很方便,所以真实开发中使用JDOM或DOM4J比较多。 又因为DOM4J与JDOM比较结果为DOM4j完胜,所以我们这里只会对DOM4j介绍,而不会介绍JDOM。 DOM和SAX解析1DOM结构模型DOM中的核心概念就是节点,在XML文档中的元素、属性、文本、处理指令,在DOM中都是节点! 2JAXP之DOM解析使用DOM解析XML的目标就是获取到Document对象,然后在从Document中获取到需要的数据。Document对象就是XML文档在内存中的样子。 1.获取Document三步:
2.遍历Document:
3JAXP之SAX解析使用SAX解析XML文档需要先给出DefualtHandler的子类,重写其中的方法。然后在使用SAX开始解析时把DefaultHandler子类对象传递给SAX解析器。
使用SAX解析首先需要获取工厂,再通过工厂获取解析器对象,然后使用解析对象完成解析工作:
DOM4J解析1DOM4J概述DOM4J是针对Java开发人员专门提供的XML文档解析规范,它不同与DOM,但与DOM相似。DOM4J针对Java开发人员而设计,所以对于Java开发人员来说,使用DOM4J要比使用DOM更加方便。 在DOM4J中,也有Node、Document、Element等接口,结构上与DOM中的接口比较相似。但它们是不同的类: lNode ?Attribute:表示属性节点; ?Branch:表示可以包含子元素的节点: nDocument:表示整个文档; nElement:表示元素节点; ?CharacterData:表示文本节点: nText:表示文本内容; nCDATA:表示CDATA段内容; nComment:表示注释内容。 我们再次强调,DOM和DOM4J是不同的,DOM中的Document是org.w3c.Document,而DOM4J中的Document是org.dom4j.Document,它们是不同的类,其他Node、Element也是一样。 2 读取、保存、创建Document使用dom4j需要导入: ldom4j.jar ljaxen.jar 1.读取
2.保存XML文档
3.创建Document
3 遍历Document
4 添加student元素
5 查询元素
6 修改元素
7 删除学生元素
8dom4jAPI介绍Node方法: lStringasXML():把当前节点转换成字符串,如果当前Node是Document,那么就会把整个XML文档返回; lStringgetName():获取当前节点名字;Document的名字就是绑定的XML文档的路径;Element的名字就是元素名称;Attribute的名字就是属性名; lDocumentgetDocument():返回当前节点所在的Document对象; lshortgetNodeType():获取当前节点的类型; lStringgetNodeTypeName():获取当前节点的类型名称,例如当前节点是Document的话,那么该方法返回Document; lStringgetStringValue():获取当前节点的子孙节点中所有文本内容连接成的字符串; lStringgetText():获取当前节点的文本内容。如果当前节点是Text等文本节点,那么本方法返回文本内容;例如当前节点是Element,那么当前节点的内容不是子元素,而是纯文本内容,那么返回文本内容,否则返回空字符串; lvoidsetDocument(Documentdoc):给当前节点设置文档元素; lvoidsetParent(Elementparent):给当前节点设置父元素; lvoidsetText(Stringtext):给当前节点设置文本内容; Branch方法: lvoidadd(Elemente):添加子元素; lvoidadd(Nodenode):添加子节点; lvoidadd(Commentcomment):添加注释; lElementaddElement(StringeleName):通过名字添加子元素,返回值为子元素对象; lvoidclearContent():清空所有子内容; lListcontent():获取所有子内容,与获取所有子元素的区别是,<name>liSi</name>元素没有子元素,但有子内容; lElementelementById(Stringid):如果元素有名为“ID”的属性,那么可以使用这个方法来查找; lintindexOf(Nodenode):查找子节点在子节点列表中的下标位置; lNodenode(intindex):通过下标获取子节点; lintnodeCount():获取子节点的个数; lIteratornodeIterator():获取子节点列表的迭代器对象; lbooleanremove(Nodenode):移除指定子节点; lbooleanremove(Commontcommont):移除指定注释; lbooleanremove(Elemente):移除指定子元素; lvoidsetContent(Listcontent):设置子节点内容; Document方法: lElementgetRootElement():获取根元素; lvoidsetRootElement():设置根元素; lStringgetXmlEncoding():获取XML文档的编码; lvoidsetXmlEncoding():设置XML文档的编码; Element方法: lvoidadd(Attributeattr):添加属性节点; lvoidadd(CDATAcdata):添加CDATA段节点; lvoidadd(TextText):添加Text节点; lElementaddAttribute(Stringname,Stringvalue):添加属性,返回值为当前元素本身; lElementaddCDATA(Stringcdata):添加CDATA段节点; lElementaddComment(Stringcomment):添加属性节点; lElementaddText(Stringtext):添加Text节点; lvoidappendAttributes(Elemente):把参数元素e的所有属性添加到当前元素中; lAttributeattribute(intindex):获取指定下标位置上的属性对象; lAttributeattribute(Stringname):通过指定属性名称获取属性对象; lintattributeCount():获取属性个数; lIteratorattributeIterator():获取当前元素属性集合的迭代器; lListattributes():获取当前元素的属性集合; lStringattributeValue(Stringname):获取当前元素指定名称的属性值; lElementcreateCopy():clone当前元素对象,但不会copy父元素。也就是说新元素没有父元素,但有子元素; lElementelement(Stringname):获取当前元素第一个名称为name的子元素; lIteratorelementIterator():获取当前元素的子元素集合的迭代器; lIteratorelementIterator(Stringname):获取当前元素中指定名称的子元素集合的迭代器; lListelements():获取当前元素子元素集合; lListelements(Stringname):获取当前元素指定名称的子元素集合; lStringelementText(Stringname):获取当前元素指定名称的第一个元素文件内容; lStringelementTextTrime(Stringname):同上,只是去除了无用空白; lbooleanisTextOnly():当前元素是否为纯文本内容元素; lbooleanremove(Attributeattr):移除属性; lbooleanremove(CDATAcdata):移除CDATA; lbooleanremove(Texttext):移除Text。 DocumentHelper静态方法介绍: lstaticDocumentcreateDocument():创建Dcoument对象; lstaticElementcreateElement(Stringname):创建指定名称的元素对象; lstaticAttributecreateAttrbute(Elementowner,Stringname,Stringvalue):创建属性对象; lstaticTextcreateText(Stringtext):创建属性对象; lstaticDocumentparseText(Stringtext):通过给定的字符串生成Document对象; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |