Xml文件之解析
来源:互联网 发布:淘宝店铺租金 编辑:程序博客网 时间:2024/05/17 23:14
XML之Sax(simple api for xml )解析:
主实现类:
package com.xml;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.junit.Test;import org.xml.sax.SAXException;/* * Sex解析的特点: * 1.基于事件的读取 * 2.基于顺序的读取,速度快 * 3.不能任意读取节点(灵活性差一些) * 4.sex更适用于在要求跟高的设备上使用(Android开发中); * 5.解析时占用内存小 */public class ImplementsXML { @Test public static void saxparsemxl() { //1.创建一个sax解析工厂对象 SAXParserFactory spf=SAXParserFactory.newInstance(); //2.通过工厂对象创建sax解析器 try { SAXParser sp= spf.newSAXParser(); //3.创建一个数据处理器(需要我们自己来编写) dataParser dp=new dataParser(); //4.开启解析 InputStream is= Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml"); try { //参数一输入文件字节流 /参数二 自己编写的数据处理器 sp.parse(is,dp); ArrayList<person> p=dp.getPersons(); //通过for循环输出对象 for(person p1:p) { System.out.println(p1); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { //调用解析xml的方法 saxparsemxl(); }}
数据处理器类:
package com.xml;import java.util.ArrayList;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class dataParser extends DefaultHandler { private ArrayList<person> persons=new ArrayList<person>(); private person p;//当前正在解析的person对象 private String tag;//用于记录正在解析的标签名 public ArrayList<person> getPersons() { return persons; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); ; System.out.println("开启解析文档>>>>>>>>>"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("文档解析结束."); } //解析开始元素时调用 /* * String 命名空间, String 不带前缀的标签名字, String 不带前缀的标签名字, Attributes 当前标签的属性集合 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); //表示解析到了person标签 if("person".equals(qName)) { p=new person(); String id=attributes.getValue("person"); //设置id p.setId(id); } tag=qName; System.out.println("startElement"+qName); } //解析结束元素时调用 @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub super.endElement(uri, localName, qName); if("person".equals(qName)) { persons.add(p); tag=null; } System.out.println("endElement"+qName); } //解析文本时调用 @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); if(tag !=null) { if("name".equals(tag)){ p.setName(new String(ch,start,length)); }else if("address".equals(tag)) { p.setAddress(new String (ch,start,length)); }else if("tel".equals(tag)) { p.setTel(new String (ch,start,length)); }else if("fax".equals(tag)) { p.setFax(new String (ch,start,length)); }else if("email".equals("tag")) { p.setEmail(new String (ch,start,length)); } } System.out.println(ch); }}
解析的对象person类
package com.xml;public class person { private String name; private String address; private String email; private String tel; private String fax; private String id; public person() { super(); // TODO Auto-generated constructor stub } public person(String name, String address, String email, String tel, String fax, String id) { super(); this.name = name; this.address = address; this.email = email; this.tel = tel; this.fax = fax; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getFax() { return fax; } public void setFax(String fax) { this.fax = fax; } public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public String toString() { return "person [name=" + name + ", address=" + address + ", email=" + email + ", tel=" + tel + ", fax=" + fax + ", id=" + id + "]"; }}
xml文件:
<?xml version="1.0" encoding="UTF-8"?><persion> <person id="p1"> <name>小红</name> <address>上海</address> <tel>100886</tel> <fax>001100</fax> <email>18866.@qq.com</email> </person> <person id="p2"> <name>小明</name> <address>上海</address> <tel>189886</tel> <fax>011110</fax> <email>1888.@qq.com</email> </person></persion>
XML之Dom(document Object Modo)解析:
package com.xml;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;/* * DOM解析mxl * 1.基于树形结构,通过解析器一次性把文档加载到内存中, * 会比较占用内存,可以随机访问,跟适用于web开发中使用 */public class domeParserXml { public static void parset() { //1.创建一个dom解析器工厂 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //2.通过工厂对象创建解析器对象 //4.从内存中读取数据 try { DocumentBuilder db=factory.newDocumentBuilder(); //3.解析文档 InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml"); try { //此代码执行后整个xml已经加载到内存当中,以树状形式存储 Document doc=db.parse(is);//通过解析器进行解析 //返回一个NodeList节点 person p=null; NodeList nl=doc.getElementsByTagName("person"); ArrayList<person> persons=new ArrayList<>(); //遍历NodeList节点 //获取属性值 for(int i=0;i<nl.getLength();i++) { Node personNode=nl.item(i); p=new person(); String s=personNode.getAttributes().getNamedItem("id").getNodeValue(); p.setId(s); //获取当前节点的所有子节点 NodeList childNodel=doc.getChildNodes(); for(int j=0;j<childNodel.getLength();j++) { Node item=childNodel.item(j); String nodename=item.getNodeName(); if("name".equals(nodename)) { p.setName(item.getFirstChild().getNodeValue()); }else if("address".equals(nodename)) { p.setAddress(item.getFirstChild().getNodeValue()); }else if("email".equals(nodename)) { p.setEmail(item.getFirstChild().getNodeValue()); }else if("fax".equals(nodename)) { p.setFax(item.getFirstChild().getNodeValue()); }else if("tel".equals(nodename)) { p.setTel(item.getFirstChild().getNodeValue()); } persons.add(p); } for(person person:persons) { System.out.println(person); } } } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { parset(); }}
XML之JDom(java document Object Modo)解析:
package com.xml;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;/* * JDOM解析 xml * 1.于dom类似,都是基于树形结构 * 2.于dom的区别 * (1)第三方开源的组件 * (2)实现使用java的collection接口 * (3)效率比DOM更快 * */public class JDomParserXml { public static void parser() { //创建JDOM解析器 //注意他不是SAX,只是名字叫SAX SAXBuilder sb=new SAXBuilder(); InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml"); try { //开始解析 Document build=sb.build(is); //获取根节点 Element rootelemnt =build.getRootElement(); List<person> list=new ArrayList<>(); person person=null; //根节点根节点获取子元素:返回list person对象集合 List<Element> childList=rootelemnt.getChildren(); for(Element element:childList ) { person=new person(); String id=element.getAttributeValue("id"); person.setId(id); List<Element> ChildrenList= element.getChildren(); for(Element e:ChildrenList ) { //取到标签名字 String tag=e.getName(); if("name".equals(tag)) { person.setName(e.getText()); }else if("address".equals(tag)) { person.setAddress(e.getText()); }else if("email".equals(tag)) { person.setEmail(e.getText()); }else if("fax".equals(tag)) { person.setFax(e.getText()); }else if("tel".equals(tag)) { person.setTel(e.getText()); } } list.add(person); } for(person p:list) { System.out.println(p); } } catch (JDOMException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { parser(); }}
XML之Dom4J(document Object Modo for java)解析:
注意4j不念4,而是读for
package com.xml;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/* * JDOM解析 xml * 1.于DOM,都是基于树形结构 * 2.于第三方开源的组件,效率比DOM更快 * 3.JDOM和DOM在性能测试时性能表示不加,在测试10m文档时内存溢出 * SAX表现较好,这事依赖与它的解析特性 * DOM4J是这场测试的获胜者 */public class dom4jparser { public static void parser() throws IOException { //创建DOM4j解析器 SAXReader reader=new SAXReader(); InputStream is=Thread.currentThread().getContextClassLoader().getResourceAsStream("com/xml/NewFile.xml"); try { //返回 DOM4j包中的的 document对象 Document dc=reader.read(is); Element rootelement=dc.getRootElement(); //获取迭代器 Iterator<Element> iterator=rootelement.elementIterator(); ArrayList<person> personList=new ArrayList<>(); person p=null; //循环素如 while(iterator.hasNext()) { p=new person(); Element e=iterator.next(); p.setId(e.attributeValue("id")); //Iterator<Element> iterator1 = null; while(iterator.hasNext()) { Element name=iterator.next(); String tag=name.getName(); if("name".equals(tag)) { p.setName(name.getText()); }else if("address".equals(tag)) { p.setAddress(name.getText()); }else if("email".equals(tag)) { p.setEmail(name.getText()); }else if("fax".equals(tag)) { p.setFax(name.getText()); }else if("tel".equals(tag)) { p.setTel(name.getText()); } } personList.add(p); } for(person pp:personList) { System.out.println(pp); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { try { parser(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
XmlDecoder和XmlEncoder解析xml文件
package com.xml;import java.beans.XMLDecoder;import java.beans.XMLEncoder;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;public class xmlDome {//**************************XML编码方法*************************** public static void xmlEnCoder() { OutputStream out = null; try { out = new FileOutputStream("C:\\Users\\龙布天下\\Desktop\\long.xml"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } BufferedOutputStream bos=new BufferedOutputStream(out); //创建编码器 XMLEncoder xmlEncoder=new XMLEncoder(out); person p=new person(); p.setName("小亮"); p.setAddress("上海"); p.setEmail("18444.@qq.com"); p.setFax("05112"); p.setTel("100990"); p.setId("01"); xmlEncoder.writeObject(p); xmlEncoder.close(); }//**************************XML解码方法*************************** public static void xmlDeCoder() { InputStream in = null; try { in = new FileInputStream("C:\\Users\\龙布天下\\Desktop\\long.xml"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } XMLDecoder xmlDecoder=new XMLDecoder(in); person p=(person) xmlDecoder.readObject(); System.out.println(p); } public static void main(String[] args) { //调用编码方法 xmlEnCoder(); //调用解码方法 xmlDeCoder(); }}
XStream工具解析xml文件
package com.xml;import com.thoughtworks.xstream.io.xml.Xpp3DomDriver;/* * 使用xStream工具实现XML的解析与生成 */public class XStream { public static void XStream() { person p=new person(); p.setName("小亮"); p.setAddress("上海"); p.setEmail("18444.@qq.com"); p.setFax("05112"); p.setTel("100990"); p.setId("01"); //创建XPP驱动 //Xpp3DomDriver xpp=new Xpp3DomDriver(); com.thoughtworks.xstream.XStream x=new com.thoughtworks.xstream.XStream(new Xpp3DomDriver()); //根节点取别名 x.alias("person",person.class); //属性值取别名 x.useAttributeFor(person.class,"id"); String s=x.toXML(p); System.out.println(s); //注意!!!!!!!!!!!!!!!!开始解析; //返回person对象 person person=(com.xml.person) x.fromXML(s); System.out.println(person); } public static void main(String[] args) { //调用方法 XStream(); }}
**
xml常用四种解析方式优缺点的分析
**
xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下。首先介绍一下xml语言:可扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。xml的语法:XML 分为两部分:头信息,主体信息头信息是用来描述 XML 的一些属性,例如:版本,编码等,还可以提供 XML 显示的样式,和 dtd 编写格式。主体信息中包含的是 XML 的具体数据。头信息的语法:<?xml version =”1.0” encoding =”GBK” ?>其中 version 是必须加的,而 encoding 可以不写,则默认编码是 ISO8859-1 ,不支持中文。除了这个功能外,头信息还可以进行编写格式的规定,通过 dtd 或 xsd 文件。头信息还支持样式表的导入,允许通过样式表控制 XML 的显示。这样可以使用 XML+ CSS 完成页面的显示,通过这种形式完成 MVC 中的 View 层:优点:代码的安全性很高,可以很容易的替换模板。缺点:开发成本太高主体信息 就是由三种节点组成的,节点之间存在父与子的关系,注意的点: 一个节点只能有一个父节点,如果没有父节点,该节点称为根节点。 一个节点可以有多个子节点。只有元素节点可以拥有子节点。 元素节点的标记必须成对出现,或直接结束。特殊字符必须转义。依据字符所处的位置是否对 XML 格式造成影响来决定是否进行转义根节点只能有一个xml常用的四种解析方式:1)DOM(Document Object Model)文档对象模型分析方式。以层次结构(类似于树型)来组织节点和信息片段,映射XML文档的结构,允许获取和操作文档的任意部分。是W3C的官方标准。优点:1、允许应用程序对数据和结构做出更改。2、访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。缺点:1、通常需要加载整个XML文档来构造层次结构,消耗资源大2)SAX(Simple API for XML)流模型中的推模型分析方式。通过事件驱动,每发现一个节点就引发一个事件,通过回调方法完成解析工作,解析XML文档的逻辑需要应用程序完成。优点:1、不需要等待所有数据都被处理,分析就能立即开始。2、只在读取数据时检查数据,不需要保存在内存中。3、可以在某个条件得到满足时停止解析,不必解析整个文档。4、效率和性能较高,能解析大于系统内存的文档。缺点:1、需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),使用麻烦。2、单向导航,很难同时访问同一文档的不同部分数据,不支持XPath。3)JDOM(Java-based Document Object Model)Java特定的文档对象模型。自身不包含解析器,使用SAX。优点:1、使用具体类而不是接口,简化了DOM的API。2、大量使用了Java集合类,方便了Java开发人员。缺点:1、没有较好的灵活性。2、性能较差。4)DOM4J(Document Object Model for Java)简单易用,采用Java集合框架,并完全支持DOM、SAX和JAXP。优点:1、大量使用了Java集合类,方便Java开发人员,同时提供一些提高性能的替代方法。2、支持XPath。3、有很好的性能。缺点:1、大量使用了接口,API较为复杂。
阅读全文
0 0
- Xml文件之解析
- xml解析之SAX解析xml文件
- Android之XML文件解析
- wxWidget之XML文件解析
- Android之解析XML文件
- Libgdx之XML文件解析
- android之解析xml文件
- XML学习之SAX解析XML文件
- XML文件解析之PULL模式解析
- Java 解析 XML 文件之 SAX 解析
- Java 解析 XML 文件之 DOM 解析
- Java 解析 XML 文件之 PULL 解析
- Java 解析 XML 文件之 DOM4J 解析
- xml文件解析之sax解析
- xml文件解析之pull解析
- XML文件解析之DOM解析
- XML文件解析之SAX解析
- XML文件解析之PULL解析
- Linux平台总线驱动设备模型
- ”vmware虚拟机迁移后无网卡eth0只有lo“的解决方法
- 在vos2009或3000上用户设置了费率不计费的解决方案
- upstart进程
- Python3之网络编程总结
- Xml文件之解析
- Qt学习之路(30): Graphics View Framework
- 贝塞尔曲线
- Spring Boot 1中使用MyBatis 3总结
- Qt的GraphicsView框架
- 关于科研学习的思考摸索
- redhat 6.5企业版下安装英特尔光纤万兆网卡
- 僵尸进程产生
- 大家用什么杀毒软件?