Java 解析XML数据的4种方式
解析的四种方式
- DOM解析
- SAX解析
- JDOM解析
- DOM4J解析
案例实操
DOM解析
DOM(DocumentObjectModel,文档对象模型),在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称为DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。XML本身是以树状的形式出现的,所以DOM操作的时候,也将按章树的形式进行转换。在整个DOM树中,最大的地方指的是Document,表示一个文档,在这个文档中只存在一个根节点。
注意:在使用DOM操作的时候,每一个文字的区域也是一个节点,称为文本节点。
核心操作接口
在DOM解析中有以下四个核心的操作接口:
Document:此接口代表了整个XML文档,表示的是整棵DOM树的根,提供了对文档中的数据进行访问和操作的入口,通过Document节点可以访问XML文件中所有的元素内容。
Node:此接口在整个DOM树中具有举足轻重的地位,DOM操作的核心接口中有很大一部分接口是从Node接口继承过来的。例如:Document、Element等接口,在DOM树中,每一个Node接口代表了DOM树中的一个节点。
NodeList:此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,例如:一个节点的子节点,当文档改变的时候会直接影响到NodeList集合。
NamedNodeMap:此接口表示的是一组节点和其唯一名字对应的一一对应关系,本接口主要用于属性节点的表示上。
DOM解析过程
如果一个程序需要进行DOM解析读取操作的话,也需要按照如下的步骤进行:
建立DocumentBuilderFactory:DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
建立DocumentBuilder:DocumentBuilderbuilder=factory.newDocumentBuilder();
建立Document:Documentdoc=builder.parse(“要解析的文件路径”);
建立NodeList:NodeListnl=doc.getElementsByTagName(“读取节点”);
进行XML信息读取
SAX解析
SAX(SimpleAPIforXML)解析是按照xml文件的顺序一步一步的来解析。SAX没有官方的标准机构,它不属于任何标准组织或团体,也不属于任何公司或个人,而是提供任何人使用的一种计算机技术。
SAX(SimpleAPIforXML,操作XML的简单接口),与DOM操作不同的是,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。当使用SAX解析器进行操作的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,并由这些操作方法作出相应的操作,直至整个文档扫描结束。
如果要想实现这种SAX解析,则肯定首先建立一个SAX的解析器。
//1、创建解析器工厂 SAXParserFactoryfactory=SAXParserFactory.newInstance(); //2、获得解析器 SAXParserparser=factory.newSAXParser(); //SAX解析器,继承DefaultHandler Stringpath=newFile("resource/demo01.xml").getAbsolutePath(); //解析 parser.parse(path,newMySaxHandler());
JDOM解析
在W3C本身提供的XML操作标准,DOM和SAX,但是从开发角度上看,DOM和SAX本身是各有特点的,DOM可以修改,但不适合读取大文件,而SAX可以读取大文件,但是本身不能修改。所谓的JDOM=DOM的可修改+SAX的读取大文件,JDOM本身是一个免费的开源组件,直接从www.jdom.org上下载。
- JDOM操作xml常用类:
- Document:表示整个xml文档,是一个树形结构
- Eelment:表示一个xml的元素,提供方法操作其子元素,如文本,属性和名称空间等
- Attribute:表示元素包含的属性
- Text:表示xml文本信息
- XMLOutputter:xml输出流,底层是通过JDK中流实现
- Format:提供xml文件输出的编码、样式和排版等设置
我们发现JDOM的输出操作要比传统的DOM方便得多,而且也更加直观,包括在输出的时候都很容易了。此时观察到的是JDOM对于DOM解析的支持,但是也说,JDOM本身也支持了SAX的特点;所以,可以使用SAX进行解析操作。
//获取SAX解析器 SAXBuilderbuilder=newSAXBuilder(); Filefile=newFile("resource/demo01.xml"); //获取文档 Documentdoc=builder.build(newFile(file.getAbsolutePath())); //获取根节点 Elementroot=doc.getRootElement(); System.out.println(root.getName()); //获取根节点下所有的子节点,也可以根据标签名称获取指定的直接点 Listlist=root.getChildren(); System.out.println(list.size()); for(intx=0;x DOM4J解析
dom4j是一个简单的开源库,用于处理XML、XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。下载路径:
www.dom4j.org/dom4j-1.6.1…
sourceforge.net/projects/do…
DOM4J与JDOM一样都属于一个免费的XML开源组件,但是由于现在的开发框架中使用该技术较多,比如Hibernate、Spring等都使用DOM4J这个功能,所以作为介绍,大家可以对该组件有一个了解。并没有谁好谁坏,一般框架使用DOM4J较多,而我们平时如果要用则JDOM较常见。可以发现DOM4J发挥了很多新特性,比如输出格式就可以很好。
Filefile=newFile("resource/outputdom4j.xml"); SAXReaderreader=newSAXReader(); //读取文件作为文档 Documentdoc=reader.read(file); //获取文档的根元素 Elementroot=doc.getRootElement(); //根据跟元素找到全部的子节点 Iteratoriter=root.elementIterator(); while(iter.hasNext()){ Elementname=iter.next(); System.out.println("value="+name.getText()); } 扩展~XML的创建
DOM创建
如果想要生成XML文件,则在创建文档的时候,就应该使用newDocument()方法
如果要将DOM的文档输出,本身是比较麻烦的。一次编写多次copy
publicstaticvoidcreateXml()throwsException{ //获取解析器工厂 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //获取解析器 DocumentBuilderbuilder=factory.newDocumentBuilder(); //创建文档 Documentdoc=builder.newDocument(); //创建元素、设置关系 Elementroot=doc.createElement("people"); Elementperson=doc.createElement("person"); Elementname=doc.createElement("name"); Elementage=doc.createElement("age"); name.appendChild(doc.createTextNode("lebyte")); age.appendChild(doc.createTextNode("10")); doc.appendChild(root); root.appendChild(person); person.appendChild(name); person.appendChild(age); //写出去 //获得变压器工厂 TransformerFactorytsf=TransformerFactory.newInstance(); Transformerts=tsf.newTransformer(); //设置编码 ts.setOutputProperty(OutputKeys.ENCODING,"UTF-8"); //创建带有DOM节点的新输入源,充当转换Source树的持有者 DOMSourcesource=newDOMSource(doc); //充当转换结果的持有者 Filefile=newFile("src/output.xml"); StreamResultresult=newStreamResult(file); ts.transform(source,result); }SAX创建
//创建一个SAXtransformerfactory对象 SAXTransformerFactorystf=(SAXTransformerFactory)SAXTransformerFactory.newInstance(); try{ //通过SAXTransformerFactory对象创建一个TransfomerHandler对象 TransformerHandlerhandler=stf.newTransformerHandler(); //通过transformerHandler对象创建一个transformer对象 Transformertf=handler.getTransformer(); //设置Transfomer对象的属性 tf.setOutputProperty(OutputKeys.ENCODING,"UTF-8"); tf.setOutputProperty(OutputKeys.INDENT,"yes"); //创建一个Result的对象,将其与handler关联 Filefile=newFile("src/output.xml"); if(!file.exists()){ file.createNewFile(); } Resultresult=newStreamResult(newFileOutputStream(file)); handler.setResult(result); //通过Handler编写XML的内容 //打开Document handler.startDocument(); AttributesImplattr=newAttributesImpl(); //创建根节点bookstore handler.startElement("","","bookstore",attr); attr.clear(); attr.addAttribute("","","id","","1"); handler.startElement("","","book",attr); attr.clear(); handler.startElement("","","name",attr); handler.characters("颈椎病康复指南".toCharArray(),0,"颈椎病康复指南".length()); handler.endElement("","","name"); //关闭各节点 handler.endElement("","","book"); handler.endElement("","","bookstore"); handler.endDocument(); }catch(SAXExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(FileNotFoundExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(TransformerConfigurationExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }JDOM创建
//创建节点 Elementperson=newElement("person"); Elementname=newElement("name"); Elementage=newElement("age"); //创建属性 Attributeid=newAttribute("id","1"); //设置文本 name.setText("lebyte"); age.setText("10"); //设置关系 Documentdoc=newDocument(person); person.addContent(name); name.setAttribute(id); person.addContent(age); XMLOutputterout=newXMLOutputter(); Filefile=newFile("resource/outputjdom.xml"); out.output(doc,newFileOutputStream(file.getAbsoluteFile()));DOM4J创建
//使用DocumentHelper来创建Document对象 Documentdocument=DocumentHelper.createDocument(); //创建元素并设置关系 Elementperson=document.addElement("person"); Elementname=person.addElement("name"); Elementage=person.addElement("age"); //设置文本name.setText("lebyte"); age.setText("10"); //创建格式化输出器 OutputFormatof=OutputFormat.createPrettyPrint(); of.setEncoding("utf-8"); //输出到文件 Filefile=newFile("resource/outputdom4j.xml"); XMLWriterwriter=newXMLWriter(newFileOutputStream(newFile(file.getAbsolutePath())),of); //写出 writer.write(document); writer.flush(); writer.close();以上就是Java解析XML数据的4种方式的详细内容,更多关于Java解析XML的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。