java如何解析xml文件(上)
2016-11-21 16:57
281 查看
周末回去学习了一下xml文件是如何解析的, 主流的方法有四种,即:DOM、SAX、JDOM和DOM4J.
下面是我写的一个xml文件:books.xml
一 、使用DOM解析XML文件
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
二 、使用SAX解释XML文件
【优势】
①不需要等待所有数据都被处理,分析就能立即开始。
②只在读取数据时检查数据,不需要保存在内存中。
③可以在某个条件得到满足时停止解析,不必解析整个文档。
④效率和性能较高,能解析大于系统内存的文档。
【缺点】
①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。
②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。
下面是我写的一个xml文件:books.xml
<bookstore> <book id="1"> <name>莽荒纪name> <author>我吃西红 4000 柿author> <year>2014year> <price>88price> book> <book id="2"> <name>完美世界name> <author>辰东author> <year>2015year> <language>中文language> book> bookstore>
一 、使用DOM解析XML文件
【优点】
①允许应用程序对数据和结构做出更改。
②访问是双向的,可以在任何时候在树中上下导航,获取和操作任意部分的数据。
【缺点】
①通常需要加载整个XML文档来构造层次结构,消耗资源大。
package club.itstu.xml_dom; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * @author wx * 2016年11月13日 */ public class XMLDomDemo { public static void main(String[] args) { //创建一个DocumentBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { //创建一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); //通过DocumentBuilder对象的parse方法加载books.xml文件到当前项目下 Document document = db.parse("books.xml"); //获取所有book节点的集合 NodeList bookList = document.getElementsByTagName("book"); //获取bookList的长度 System.out.println("一共有"+bookList.getLength()+"本书"); //遍历每一个book节点 for(int i=0;i"---------下面开始遍历第"+(i+1)+"本书: "); //通过item()获取每一个book节点 Node book = bookList.item(i); //获取book节点的所有属性集合 NamedNodeMap attrs = book.getAttributes(); System.out.println("第"+(i+1)+"本书一共有"+attrs.getLength()+"个属性"); //遍历book的属性 for(int j=0;j//通过item()方法获取每一个属性 Node attr = attrs.item(j); System.out.println("属性名:"+attr.getNodeName()); System.out.println("--属性值:"+attr.getNodeValue()); } //获取book节点的所有子节点 NodeList childNodes = book.getChildNodes(); //获取子节点的个数 System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子节点"); //遍历所有子节点 for(int j=0;j//区分出text类型的节点以及element类型的节点 if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){ System.out.print(childNodes.item(j).getNodeName()); System.out.println("--"+childNodes.item(j).getTextContent()); } } System.out.println("第"+(i+1)+"本书遍历完毕---------"); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
二 、使用SAX解释XML文件
【优势】
①不需要等待所有数据都被处理,分析就能立即开始。
②只在读取数据时检查数据,不需要保存在内存中。
③可以在某个条件得到满足时停止解析,不必解析整个文档。
④效率和性能较高,能解析大于系统内存的文档。
【缺点】
①需要应用程序自己负责TAG的处理逻辑(例如维护父/子关系等),文档越复杂程序就越复杂。
②单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持XPath。
package club.itstu.xml_sax; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; /** * @author wx * 2016年11月13日 */ public class SAXDemo { public static void main(String[] args) { //获取SAXParserFactory的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); try { //通过factory获取SAXParser的实例 SAXParser parse = factory.newSAXParser(); //创建SAXParsrHandler实例 SAXParsrHandler handle = new SAXParsrHandler(); parse.parse("books.xml", handle); } catch (ParserConfigurationException | SAXException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package club.itstu.xml_sax; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * @author wx * 2016年11月13日 */ public class SAXParsrHandler extends DefaultHandler { int bookIndex = 0;//判断是第几本书 public void startDocument() throws SAXException { super.startDocument(); System.out.println("解析开始"); } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if(qName.equals("book")){ bookIndex++; System.out.println("----------开始遍历第"+bookIndex+"本书内容----------"); /* //已知book元素下的属性名称,通过属性名获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是: "+value);*/ //不知道book元素下的属性名,循环遍历属性 for(int i=0;i"第"+(i+1)+"个属性名:"+attributes.getQName(i)); System.out.println("---属性值为:"+attributes.getValue(i)); } }else if(!qName.equals("book")&&!qName.equals("bookstore")){ System.out.print("节点名: "+qName); } } public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if(qName.equals("book")){ System.out.println("----------结束遍历第"+bookIndex+"本书内容----------"); } } public void endDocument() throws SAXException { super.endDocument(); System.out.println("解析结束"); } public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); String value = new String(ch, start, length); if(!value.trim().equals("")){ System.out.println("---"+value); } } }
相关文章推荐
- 在java项目中如何利用Dom4j解析XML文件获取数据
- Java如何解析某个目录下xml文件,将XML文件转换为报表数据源?
- Java中如何解析XML文件
- 如何通过java代码解析xml文件
- Java是如何解析xml文件的(DOM)
- Java如何解析某个目录下xml文件,将XML文件转换为报表数据源?
- 如何使用Java解析xml文件
- java解析xml文件
- java解析xml文件的2种方法:sax,dom
- 使用Java解析XML文件(一)——JDOM篇
- Java解析XML文件(二)
- JAVA解析XML文件的四种方法
- java解析xml文件四种方式
- java对xml全面解析,增,删,改,以及将java对象重新编组为xml文件
- java解析xml文件四种方式
- java 解析xml文件样例
- java解析xml文件四种方式
- java - xml文件解析后不能删除
- JAVA解析XML文件四种方式
- Java中如何解析XML文件