java之xml解析

xml是我们平常开发中,常见的文件格式,今天将学习他的解析方式。

四种解析方式:

  1. dom
  2. sax
  3. dom4j
  4. jdom
1、2两种方式是java官方提供的,而3、4两种则是需要jar包。

常用节点类型




Dom解析


xml文件内容

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="1">
        <name>大力水手</name>
        <author>六斤</author>
        <year>2013</year>
        <price>24</price>
    </book>
    <book id="2">
        <name>童话</name>
        <year>45</year>
        <price>2012</price>
        <language>中文</language>
    </book>
</bookstore>
<!-- 
    1. 首先看到最外层的根节点没有有用的信息
    2. 形如<></>,都是一个标签对,<>为开始标签,</>为结束标签,也叫节点。
    3. <book id = "3"></book>其中id是节点book的属性
    4. <name>文本</name> 而文本将作为name的子节点
 -->

解析代码
  			DocumentBuilderFactory dbf =   DocumentBuilderFactory.newInstance();//创建DocumentBuilderFactory对象
		   try {
			DocumentBuilder db =  dbf.newDocumentBuilder();//创建DocumentBuilder对象
			Document d =  db.parse("book.xml");//将xml文件加载到当前工程下。
			NodeList booklist = d.getElementsByTagName("book");
			System.out.println(booklist.getLength());//获取该标签的个数
			for(int i=0;i<booklist.getLength();i++){
				Node book = booklist.item(i);//注意索引值是从0开始。拿到指定的节点对象
				NamedNodeMap nnm = book.getAttributes();//获取节点对象的属性map
				for(int j=0;j<nnm.getLength();j++){//遍历属性
					Node n = nnm.item(j);
					System.out.println(n.getNodeName()+"   "+n.getNodeValue());//获取属性的名称和值。
				}
				NodeList nl =  book.getChildNodes();//book节点下的子节点集合
				System.out.println(nl.getLength());
				for(int i4=0;i4<nl.getLength();i4++){
					Node d1 = nl.item(i4);
					if(d1.getNodeType()==Node.ELEMENT_NODE){//保证获取的节点类型是Element类型
				System.out.println(d1.getNodeName()+"    "+d1.getFirstChild().getNodeValue());//注意这是的。getfirstChild节点类型就是text
					}
					
				}
				/*Element book = (Element) booklist.item(i);//使用这个方法前提就是该节点下只能有一个属性名和属性值
				String value = book.getAttribute("id");
				System.out.println(value);*/
				
			}
			 
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

其中需要注意的地方




运行结果




这里需要注意的是,我们通过程序打印出子节点的个数,居然是9个。明明是4个,什么情况。这里就需要理解节点类型,java程序在默认把换行认为text类型节点,也算在其中,而我们需要的节点是attribute类型的节点

sax解析


xml文件同上

sax解析代码

	SAXParserFactory factory =  SAXParserFactory.newInstance();//获取SAXParserFactory的实例
		try {
			SAXParser parser =  factory.newSAXParser();//获取SAXParser对象
			Saxparserhander hander = new Saxparserhander();
			parser.parse("book.xml", hander);
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

DefaultHander

package com.example.file;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Saxparserhander extends DefaultHandler {
	/*
	 * (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 * 该方法用于表示解析开始标签
	 */
	  @Override
	public void startElement(String arg0, String arg1, String arg2,
			Attributes arg3) throws SAXException {
		// TODO Auto-generated method stub
		super.startElement(arg0, arg1, arg2, arg3);
		if(arg2.equals("book")){
			/*String value = arg3.getValue("id");//这种方法是已经标的属性名
			System.out.println(value);*/
	      for(int i = 0;i<arg3.getLength();i++){//这是不知道属性名
	   System.out.println(arg3.getQName(i)+"       "+arg3.getValue(i));//获取属性名属性值
	      }
			
		}else if(!arg2.equals("book")&&!arg2.equals("bookstore")){
			
			System.out.println(arg2);
			 
		}
	}
	/*
	 * (non-Javadoc)
	 * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
	 *该方法 表示解析结束标签
	 */
	@Override
	public void endElement(String arg0, String arg1, String arg2)
			throws SAXException {
		// TODO Auto-generated method stub
		super.endElement(arg0, arg1, arg2);
	}
	  /*
	   * (non-Javadoc)
	   * @see org.xml.sax.helpers.DefaultHandler#startDocument()
	   * 表示开始解析
	   */
	  @Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.startDocument();
	}
	  /*
	   * (non-Javadoc)
	   * @see org.xml.sax.helpers.DefaultHandler#endDocument()
	   * 表示结束解析
	   */
	  @Override
	public void endDocument() throws SAXException {
		// TODO Auto-generated method stub
		super.endDocument();
	}
	  @Override
	public void characters(char[] arg0, int arg1, int arg2) throws SAXException {
		// TODO Auto-generated method stub
		super.characters(arg0, arg1, arg2);
		String value = new String(arg0, arg1, arg2);
		if(!value.trim().equals("")){
		System.out.println(value);
		}
	}

}

jdom解析


首先先要导入jdom的jar。

导入jar包两种方式

  1. 右击项目名--build path--add external archives 点击进入下载的jar包的路径,进行添加。这种方式添加jar包缺点就是项目在导入导出的时候,jar会丢失。
  2. 在项目下建lib文件,将jar包复制到该文件下,然后右击项目名--build path--configure build path 添加,就不会出现导入导出项目,jar包丢失的问题


jdom解析代码

 			 SAXBuilder builder = new SAXBuilder();//创建SAXBuilder对象
		  try {
			InputStream in = new FileInputStream("book.xml");//将文件转成流
			Document document =  builder.build(in);//这里的document的对象是jdom包下
			Element element =  document.getRootElement();//获取根节点
			List<Element> booklist = element.getChildren();//获取所有子节点集合
			for(Element book:booklist){//遍历所有的节点集合
				List<Attribute>  attributelist =  book.getAttributes();
				for(Attribute bookattribute:attributelist){//遍历属性集合
					System.out.println(bookattribute.getName()+"   "+bookattribute.getValue());//获取属性的名和值
				}
				List<Element> subbook =  book.getChildren();//获取book节点下的子节点集合
				for(Element subbookattribute:subbook){
					System.out.println(subbookattribute.getName()+"   "+subbookattribute.getValue() );//获取子节点的属性名和值。
				}
				
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		  

dom4j


首先导入jar包。


dom4j代码
	SAXReader reader = new SAXReader();//SAXReader实例
	try {
		Document document = reader.read(new File("book.xml"));//加载文件
		Element bookstore = document.getRootElement();
		Iterator<Element> it  = bookstore.elementIterator();;
		while(it.hasNext()){
			Element book  = it.next();//获取book节点
		List<org.dom4j.Attribute> bookattrlist = 	book.attributes();//获取book节点的所有属性信息集合
		for(org.dom4j.Attribute bookattr:bookattrlist){//遍历book节点下属性的信息
			System.out.println(bookattr.getName()+"   "+bookattr.getValue());//获取属性名和值
		}
		Iterator<Element> bookchilditerator =  book.elementIterator();//获取book节点下的子节点集合
		while(bookchilditerator.hasNext()){
			Element bookchild = bookchilditerator.next();//获取每一个子节点
			System.out.println(bookchild.getName()+"      "+bookchild.getStringValue());//获取子节点的名和值。
		}
		
		}
		
	} catch (DocumentException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

dom与sax优缺




总结

上面就是解析xml的四种解析方式,在我们平常使用中,我们常常要把解析出来的数据,包装成对象,方便我们的使用。






 














































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值