四中最常用的XML文件解析总结.doc_第1页
四中最常用的XML文件解析总结.doc_第2页
四中最常用的XML文件解析总结.doc_第3页
四中最常用的XML文件解析总结.doc_第4页
四中最常用的XML文件解析总结.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XML文件学习总结掌握了XML文件解析的常用的4中方式:DOM解析、SAX解析、STAX解析以及DOM4j解析XML文件。一、DOM 解析xml文件public List parse(String url) throws Exception / 1、创建解析工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();/创建工厂是单例模式,不能直接new对象,需要调用newInstance来创建对象。 / 2、创建解析器 DocumentBuilder builder = factory.newDocumentBuilder(); / 3、创建解析器的url File file = new File(url); / 4、得到解析后的Document对象 Document doncument = builder.parse(file); / 5、通过得到节点名字得到所有同名节点的集合NodeList NodeList nodeList = doncument.getElementsByTagName(student); / 6、遍历NodeList集合 for (int i = 0; i nodeList.getLength(); i+) / 得到每个节点对象 Node studentNode = nodeList.item(i); Student st = new Student(); NamedNodeMap map = studentNode.getAttributes();/for(int j=0;jmap.getLength();j+) Attr attr = (Attr)map.item(0);/ st.setId(Integer.parseInt(attr.getValue(); NodeList childList = studentNode.getChildNodes(); for(int j=0;jchildList.getLength();j+) Node childNode = childList.item(j); if(childNode.getNodeName().equals(name) st.setName(childNode.getTextContent(); if(childNode.getNodeName().equals(age) st.setAge(Integer.parseInt(childNode.getTextContent(); if(childNode.getNodeName().equals(birthday) String str2 = childNode.getTextContent(); SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd); Date birthday = sdf.parse(str2); st.setBirthday(birthday); studentList.add(st); return studentList;Xml文件为:(studen.xml) aaa201990-10-10bbb301990-10-10ccc401990-10-10解析后的文件为:5aaa20Wed Oct 10 00:00:00 CST 19902bbb30Wed Oct 10 00:00:00 CST 19903ccc40Wed Oct 10 00:00:00 CST 1990二、Sax XML文件解析:Sax解析XML文件是属于事件请求解析。主要是回调请求解析,来重写类中的方法来解析XML文件public class TestSAX extends DefaultHandler private Vector tagName; private Vector tagValue; private int step; /方法重写的部分 / 开始解析XML文件 public void startDocument() throws SAXException tagName = new Vector(); tagValue = new Vector(); step = 0; / 结束解析XML文件 public void endDocument() throws SAXException for (int i = 0; i tagName.size(); i+) if (!tagName.get(i).equals() | tagName.get(i) != null) System.out.println(节点名称: + tagName.get(i)+-节点值: + tagValue.get(i).trim(); / System.out.println(节点值: + tagValue.get(i); /* * 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分 * 这些重复的元素.qName是什么? 这样写就会抛出SAXException错误 * 通常情况下qName等于localName */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException / 节点名称 tagName.add(qName); / 循环输出属性 for (int i = 0; i attributes.getLength(); i+) / 获取属性名称 System.out.println(属性名称: + attributes.getQName(i); / 获取属性值 System.out.println(属性值: + attributes.getValue(attributes.getQName(i); /* * 在遇到结束标签时调用此方法 */ public void endElement(String uri, String localName, String qName) throws SAXException step = step + 1; /* * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, * 每解释到新的字符会把它添加到char里。 * 注意,这个char字符会自己管理存储的字符, * 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的, * 暂时找不到规律,以后看源代码. * * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值 */ public void characters(char ch, int start, int length) throws SAXException / 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内 if (tagName.size() - 1 = tagValue.size() tagValue.add(new String(ch, start, length); public static void main(String args) String filename = F:/student.xml; / String filename = d:/test.xml; SAXParserFactory spf = SAXParserFactory.newInstance(); /创建SAXParserFactory工厂对象 try SAXParser saxParser = spf.newSAXParser(); saxParser.parse(new File(filename), new TestSAX(); catch (Exception e) e.printStackTrace(); STAX 解析XML文件(事件处理模式解析)package com;import java.io.FileInputStream;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamReader;public class STAXTest public List parse(String fileName) throws Exception / STAX/ 创建解析器工厂XMLInputFactory factory = XMLInputFactory.newInstance();/ 创建解析器InputStream is = new FileInputStream(fileName);XMLStreamReader xsr = factory.createXMLStreamReader(is);List list = new ArrayList();Student st = new Student();String flag = ;while (xsr.hasNext()int event = xsr.next();if (event = XMLStreamConstants.START_ELEMENT) String tagName = xsr.getLocalName();if (student.equals(tagName) st = new Student();String id = xsr.getAttributeValue(0);st.setId(Integer.parseInt(id);if (name.equals(tagName) flag = name;if (age.equals(tagName) flag = age;if (birthday.equals(tagName) flag = birthday;if (event = XMLStreamConstants.CHARACTERS) String str = xsr.getText();if (name.equals(flag) st.setName(str);if (age.equals(flag) & !.equals(str.trim() st.setAge(Integer.parseInt(str.trim();if (birthday.equals(flag) SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd);try Date birthday = sdf.parse(str);st.setBirthday(birthday); catch (Exception e) if(event = XMLStreamConstants.END_ELEMENT)if(student.equals(xsr.getLocalName()list.add(st);return list;public static void main(String args) throws Exception STAXTest st = new STAXTest(); List list = st.parse(student.xml);for(Student s : list)System.out.println(s.getId()+t+s.getName().trim()+t+s.getAge()+t+s.getBirthday();DOM4J解析xml文件:(xml文件的生成,修改,读取、解析)import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class Test1 /* * 生成的文件是放在 F:/student.xml 目录下 */public void creat(String url)Document document = DocumentHelper.createDocument(); /建立document对象Element books = document.addElement(students); /建立根节点Element book = null; /建立普通节点对象Element name = null; /建立下属节点nameElement sex = null; /建立下属节点sex Element age = null; /建立下属节点ageElement group = null; /建立下属节点group/* * 添加注释 */document.addComment(aaaaaaaaaaaaaaaaaaaaaaaa);books.addComment(#刘军飞,2012年元月10日#);/* * 学生一 */book = books.addElement(student); /通过普通节点对象添加普通节点book.addComment(sssssssssssssssssssssssssss);book.addAttribute(show, yes); /设置节点中得属性 以及设置属性值name = book.addElement(nameinf); /添加下属节点name.addAttribute(name, 张三);group = name.addElement(班级); /添加下属节点group.setText(class1);sex = book.addElement(sex);sex.setText(男);age = book.addElement(age);age.setText(22);/* * 学生二 */book = books.addElement(student); /通过普通节点对象添加普通节点book.addAttribute(show, yes); /设置节点中得属性 以及设置属性值name = book.addElement(nameinf); /添加下属节点name.addAttribute(name, 李四);group = name.addElement(班级); /添加下属节点group.setText(class2);sex = book.addElement(sex);sex.setText(男);age = book.addElement(age);age.setText(25);/* * 学生三 */book = books.addElement(student); /通过普通节点对象添加普通节点book.addAttribute(show, no); /设置节点中得属性 以及设置属性值name = book.addElement(nameinf); /添加下属节点name.addAttribute(name, 王五);group = name.addElement(班级); /添加下属节点group.setText(class3);sex = book.addElement(sex);sex.setText(女);age = book.addElement(age);age.setText(25);try OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding(gbk);File file = new File(url);FileOutputStream fileOutputStream = new FileOutputStream(file);XMLWriter writer = new XMLWriter(fileOutputStream , outputFormat);writer.write(document);writer.close(); catch (Exception e) e.printStackTrace();public void reader(String url)File file = new File(url);System.out.println(生成的XML文件内容是:);/将xml文件打印到控制台try FileInputStream fis = new FileInputStream(url);BufferedInputStream bis = new BufferedInputStream(fis);int len = 1;byte bytes = new byte100;while(len0)len = bis.read(bytes);if(len0) System.out.print(ne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论