java里面4种关于xml的解析方法
2016-05-01 13:27
686 查看
以下资料来源于 imooc
imooc学习资料:http://www.imooc.com/learn/171
推荐大家使用第四种方法;;;
4中关于解析xml的方法:
DOM,SAX ( java 里面提供包 )
JDOM,DOM4J ( 需要自己导入包文件 )
1:DOM
2,SAX
3,JDOM
4,DOM4J
DOM4J 其他的方式:
下面的xml文件是上面的四段代码解析的文件;
ssssssssssssssssssssssssssssssssssssssssssss
imooc学习资料:http://www.imooc.com/learn/171
推荐大家使用第四种方法;;;
4中关于解析xml的方法:
DOM,SAX ( java 里面提供包 )
JDOM,DOM4J ( 需要自己导入包文件 )
1:DOM
package com.sdingba.xmlparser; import org.w3c.dom.*; import org.xml.sax.SAXException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.util.List; /** * Created by su on 16-4-30. * * DOM解析 xml文件 * * 一次性加载内存 * 优点: * 形成树的结构,直观好理解,代码更容易编写 * 解析过程中树结构保留在内存中,方便修改 * * 缺点: * 当xml文件较大时,对内存的消耗不比较大, * 容易影响解析性能,并赵成内存溢出 */ public class DOM { public static void main(String[] args) { //创建一个DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //创建一个DocumentBuilder对象 try { DocumentBuilder db = dbf.newDocumentBuilder(); //通过DocumentBuilder对象的parse解析,加载xml文件 Document document = db.parse("new.xml"); //获取所有book的集合 NodeList bookList = document.getElementsByTagName("book"); for (int i=0;i<bookList.getLength();i++) { // 通过 获取一个book的数据 Node books = (Node) bookList.item(i); //获取book节点的所有属性的集合 NamedNodeMap attrs = books.getAttributes(); //遍历book的属性, for (int j = 0; j < attrs.getLength(); j++) { //通过item获取某一个属性 attrs.item(j).getNodeName(); //获取属性值 getNodeValue(); System.out.println("id == "+attrs.item(j).getNodeValue()); } // //前提book节点 有且只有一个: // Element book = (Element) bookList.item(i); // //sttrValue 为 book里面的id值 // String attrValue = book.getAttribute("id"); // System.out.println(attrValue); NodeList chileNodes = books.getChildNodes(); //遍历chileNode的节点和节点名 for (int k = 0; k < chileNodes.getLength(); k++) { //区分text类型的node以及element的类型 if (chileNodes.item(k).getNodeType() == Node.ELEMENT_NODE) { //获取的element类型的节点的节点名 String aa = chileNodes.item(k).getNodeName(); System.out.print(aa+" ===== : "); //bb2 为空; String bb2 = chileNodes.item(k).getNodeValue(); String bb = chileNodes.item(k).getFirstChild().getNodeValue(); // String bb = chileNodes.item(k).getTextContent(); System.out.println(bb); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
2,SAX
package com.sdingba.xmlparser; import com.sdingba.javabean.Book; import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; import com.sun.xml.internal.bind.v2.model.core.ID; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.util.ArrayList; /** * Created by su on 16-4-30. * Handler 解析原理 * * 基于事件的解析,一条一条的解析 * * 优点: * 采用事件驱动模式,对内存的消耗比较小 * 适合于只需要处理xml数据时 * 缺点,不易编码 * 很难同时访问一个xml中的多个不同的数据 */ public class SAX { public static void main(String[] args) { //1.通过SAXparserFactory 的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //通过factory获取SAXParser的实例 SAXParser parser = factory.newSAXParser(); SAXParserHandler handler = new SAXParserHandler(); parser.parse("new.xml", handler); int a = handler.getBookList().size(); for (Book book : handler.getBookList()) { System.out.println("id = "+book.getId()); System.out.println(book.getName()); System.out.println(book.getAuthor()); System.out.println(book.getYear()); System.out.println(book.getPrice()); System.out.println(book.getLanguage()); System.out.println("-------finish-------"); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } static class SAXParserHandler extends DefaultHandler { Book book; public ArrayList<Book> getBookList() { return bookList; } public void setBookList(ArrayList<Book> bookList) { this.bookList = bookList; } private ArrayList<Book> bookList = new ArrayList<Book>(); String value = null; private int bookIndex = 0; /** * 解析开始 * * @throws SAXException */ @Override public void startDocument() throws SAXException { super.startDocument(); System.out.println("解析开始"); } /** * 解析结束 * * @throws SAXException */ @Override public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析结束"); } /** * 用来遍历xml文件的开始标签 * * @throws SAXException */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); // if (qName.equals("book")) { bookIndex++; book = new Book(); System.out.println("开始第" + bookIndex + "本书的解析======"); //以知 book元素的属性 String value = attributes.getValue("id"); System.out.println("book+" + value);//book+2 //如果不知道book元素的属性值 int num = attributes.getLength(); for (int i = 0; i < num; i++) { System.out.println(attributes.getQName(i));//属性名 id System.out.println("属性值“===" + attributes.getValue(i)); if (attributes.getQName(i).equals("id")) { book.setId(attributes.getValue(i)); } } } else if (!qName.equals("book") && !qName.equals("bookstore")) { System.out.println("节点名”" + qName); } } /** * 用来遍历xml文件的结束标签 * * @throws SAXException */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { //调用DefaultHandler类的startElement方法; super.endElement(uri, localName, qName); //判断是否针对一本书进行遍历 if (qName.equals("book")) { bookList.add(book); book = null; System.out.println("=====结束" + bookIndex + "的解析"); } else if (qName.equals("name")) { book.setName(value); } else if (qName.equals("author")) { book.setAuthor(value); } else if (qName.equals("year")) { book.setYear(value); } else if (qName.equals("price")) { book.setPrice(value); } else if (qName.equals("language")) { book.setLanguage(value); } } /** * @param ch ,,整个共享xml文档的内容 * start 开始节点 * length 长度 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); value = new String(ch, start, length); if (!value.trim().equals("")) { System.out.println("节点值是::" + value); } } } }
3,JDOM
package com.sdingba.xmlparser; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * Created by su on 16-5-1. * 不是java官方提高的,。需要导入jar包 * * * */ public class JDOM { public static void main(String[] args) { //进行对new。xml文件的解析 //1, SAXBuilder saxBuilder = new SAXBuilder(); try { //2,创建一个输入流 InputStream in = new FileInputStream("new.xml"); //3,通过saxBuiler的build的方法,将输入流加载到sax里面 Document document = saxBuilder.build(in); //通过decument对象,。获取xml文件的根节点 Element rootElement = document.getRootElement(); //获取根节点下的子节点,集合 List<Element> booklist = rootElement.getChildren(); //继续进行解析 for (Element book : booklist) { System.out.println("开始解析第" + booklist.indexOf(book) + 1 + "本书====="); //解析book的属性, List<Attribute> attrList = book.getAttributes(); /* //如果知道属性值的时候,可以选择下面这行代码获取属性值 String aaaa = book.getAttributeValue("id"); System.out.println(aaaa); //aaaa = 1,和下面的for循环里面的一样效果 */ //遍历属性名,针对不清楚book下的属性值 for (Attribute attribute : attrList) { //获取属性名 String attrName = attribute.getName(); //获取属性值 String attrValue = attribute.getValue(); System.out.println(attrName + "---" + attrValue); } //对book节点的子节点的节点名以及节点值进行遍历 List<Element> bookChilds = book.getChildren(); for (Element chile : bookChilds) { String name = chile.getName(); String value = chile.getValue(); System.out.print(name+" ---- "); System.out.println(value); } //对book节点的子节点的节点名和接地安置 System.out.println("结束解析第" + booklist.indexOf(book) + 1 + "本书====="); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
4,DOM4J
package com.sdingba.xmlparser; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; import java.util.Iterator; import java.util.List; /** * Created by su on 16-5-1. * jdom的一种智能分支, * */ public class Dom4J { public static void main(String[] args) { //创建SAXReader的duixaing SAXReader reader = new SAXReader(); //通富哦reader对象read try { // Document document = reader.read("new.xml"); Document document = reader.read(new File("new.xml")); //通过document对象获取根节点 Element bookStore = document.getRootElement(); /* //如果你知道很多属性,只要求获取某些属性 String bookname = bookStore.element("book").element("name").getText(); System.out.println(bookname);//直接打印书名:你是我的女神 */ //通过elementIterator方法获取迭代器 Iterator<Element> it = bookStore.elementIterator(); //遍历迭代器 while (it.hasNext()) { System.out.println("======开始遍历莫一本书"); Element book = (Element) it.next(); //获取book的属性名和属性值 List<Attribute> bookAttrs = book.attributes(); for (Attribute attr : bookAttrs) { String name = attr.getName(); String vale = attr.getValue(); System.out.println(name + "---" + vale); } Iterator iit = book.elementIterator(); while (iit.hasNext()) { Element bookClild = (Element) iit.next(); String value = bookClild.getStringValue(); String name = bookClild.getName(); System.out.println(name + "=---=" + value); } System.out.println("======结束遍历某一本书"); } } catch (DocumentException e) { e.printStackTrace(); } } }
DOM4J 其他的方式:
//创建SAXReader的duixaing SAXReader reader = new SAXReader(); //通富哦reader对象read try { // Document document = reader.read("new.xml"); Document document = reader.read(new File("new.xml")); //通过document对象获取根节点 Element bookStore = document.getRootElement(); List<Element> elementList = bookStore.elements(); for (Element ele : elementList) { List<Element> elementss = ele.elements(); // String value1 = ele.getText(); // String value = ele.getStringValue();// // String name = ele.getName(); // System.out.println(value); System.out.println(); for (Element eles : elementss) { String val = eles.getText(); String namenode = eles.getName(); System.out.println(namenode + " ==== " + val); } }
下面的xml文件是上面的四段代码解析的文件;
<?xml version="1.0" encoding="UTF-8" ?> <bookstore> <book id="1"> <name>你是我的女神</name> <author>sdingba</author> <year>2016</year> <price>89</price> </book> <book id="2"> <name>你是我的女神2</name> <author>sdingba2</author> <year>2017</year> <price>88</price> </book> </bookstore>
ssssssssssssssssssssssssssssssssssssssssssss
<?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>Java就业培训教程</书名> <作者>张</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张</作者> <售价>28.00元</售价> </书> </书架>
public static void main(String[] args) throws Exception { //如果实在 web中 // 1, InputStream aaInputStream = request.getInputStream(); // 2, SAXReader reader = new SAXReader(); // 3, Document dom = reader.read(aaInputStream); //1.获取解析器 SAXReader reader = new SAXReader(); //2.解析xml获取代表整个文档的dom对象 Document dom = reader.read("book.xml"); //3.获取根节点 Element root = dom.getRootElement(); //4.获取书名进行打印 String bookName = root.element("书").element("书名").getText(); System.out.println(bookName); }
@Test public void attr() throws Exception{ SAXReader reader = new SAXReader(); Document dom = reader.read("book.xml"); Element root = dom.getRootElement(); Element bookEle = root.element("书"); //bookEle.addAttribute("出版社", "传智出版社"); // String str = bookEle.attributeValue("出版社"); // System.out.println(str); Attribute attr = bookEle.attribute("出版社"); attr.getParent().remove(attr); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); } @Test public void del() throws Exception{ SAXReader reader = new SAXReader(); Document dom = reader.read("book.xml"); Element root = dom.getRootElement(); Element price2Ele = root.element("书").element("特价"); price2Ele.getParent().remove(price2Ele); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); } @Test public void update()throws Exception{ SAXReader reader = new SAXReader(); Document dom = reader.read("book.xml"); Element root = dom.getRootElement(); root.element("书").element("特价").setText("4.0元"); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); } @Test public void add()throws Exception{ SAXReader reader = new SAXReader(); Document dom = reader.read("book.xml"); Element root = dom.getRootElement(); //凭空创建<特价>节点,设置标签体 Element price2Ele = DocumentHelper.createElement("特价"); price2Ele.setText("40.0元"); //获取父标签<书>将特价节点挂载上去 Element bookEle = root.element("书"); bookEle.add(price2Ele); //将内存中的dom树会写到xml文件中,从而使xml中的数据进行更新 // FileWriter writer = new FileWriter("book.xml"); // dom.write(writer); // writer.flush(); // writer.close(); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); } @Test public void find() throws Exception{ SAXReader reader = new SAXReader(); Document dom = reader.read("book.xml"); Element root = dom.getRootElement(); List<Element> list = root.elements(); Element book2Ele = list.get(1); System.out.println(book2Ele.element("书名").getText()); }
相关文章推荐
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 关于springmvc的流程
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
- JAVA流程控制
- Java泛型
- 20145305 《Java程序设计》第9周学习总结
- Sun java认证考试真题答案及部分解析(三)
- Sun java认证考试真题答案及部分解析(二)
- Sun java认证考试真题答案及部分解析(一)
- 传智播客 2015 刘意 Java基础-视频-笔记day27(完结)(2016年5月1日12:53:07)
- SpringMVC 使用JSR-303进行校验
- Java 栈帧
- spring常量值注入
- JAVA反射
- springmvc上传图片
- MyEclipse 2016 安装/破解
- JAVA多线程之中断机制stop()、interrupted()、isInterrupted()
- Java数据类型及类型转换
- Java数据类型及类型转换