2020-09-15 Java Xml解析

XML解析方式

1.DOM解析
2.SAX解析
3.JDOM解析
4.DOM4J解析
1.2种是基础方法,官方提供,无关平台,3.4种属于扩展方法,只适用于Java平台。

DOM解析

DOM(Document Object Model)文档对象模型,将XML文件映射成一个倒挂的树

步骤
-创建解析器工厂对象
-由解析器工厂对象创建解析器对象
-由解析器对象对指定XML文件进行解析,构建DOM树,创建Document
-以Doucument对象为起点对DOM树的节点进行增删改操作

核心代码

// 1、得到DOM解析器的工厂实例
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			
			// 2、从DOM工厂获得DOM解析器
			DocumentBuilder db = dbf.newDocumentBuilder();
			
			// 3、解析XML文档,得到一个Document,即DOM树
			Document doc = db
					.parse("src\\xxx.xml");
			
			// 4、得到所有<xxx>节点列表信息
			NodeList xxxList = doc.getElementsByTagName("xxx");
			System.out.println("xml文档中共有" + xxxList.getLength() + "条信息");
			
			// 5、轮循xxx对象信息
			for (int i = 0; i < xxxList.getLength(); i++) {

				// Xxx newXxx = new Xxx();

				// 5.1、获取第i个xxx元素信息
				Node xxx = xxxList.item(i);
				
				// 5.2、获取第i个xxx元素的id属性的值并输出
				Element element = (Element) dog;
				String attrValue = element.getAttribute("id");
				// newXxx.setId(attrValue);
				System.out.println("id:" + attrValue);
				
				// 5.3、获取第i个xxx元素的所有子元素的名称和值并输出
				for (Node node =xxx.getFirstChild(); node != null; node = node
						.getNextSibling()) {
					if (node.getNodeType() == Node.ELEMENT_NODE) {
					
						String name = node.getNodeName();// name
						String value = node.getFirstChild().getNodeValue();// YAYA
						System.out.print(name + ":" + value + "\t");
						
						/*
						 * if("name".equals(name)) { newXxx.setName(value); }
						 * 
						 * if("health".equals(name)) { newXxx.setHealth(value);
						 * } ..
						 */
					}
				}
				System.out.println();
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

SAX解析

是Sun公司提供的,内置JDK中。org.xml.sax.*
解析基于事件的编程方法,解析速度快,不需要直接读入整个文档。

核心代码

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

//编写DefaultHandler
public class MyDefaultHandler extends DefaultHandler {
    /*
     * 开始文档时调用
     * */
    @Override
    public void startDocument() throws SAXException {
        System.out.println("--开始文档了--");
    }
    /*
     * 开始标签时调用
     * @param qName:表示开始标签的标签名
     * @param attributes:表示开始标签内的包含的属性列表
     */
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    	System.out.println("--开始标签"+"-------->"+qName);
        
    }
    /*
     * 结束标签时调用
     * @param qName:结束标签的标签名
     * */
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        System.out.println("--结束标签"+"----->"+qName);
    }
    /*
     *读到文本内容时调用
     * @param ch:表示当前读取到的所有文本内容
     * @param start:表示当前文本内容的开始位置
     * @param length:表示当前文本内容长度
     */
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    	//把获取文本内容转为字符串
        String content=new String(ch,start,length);
        System.out.println("获取文本内容"+"----->"+content);
    }
    /*
     * 结束文档时调用
     * */
    @Override
    public void endDocument() throws SAXException {
        System.out.println("--结束文档 !--");
}
}

//测试类
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MainClass {
    
	   public static void main(String[] args) throws Exception, SAXException {
	        //1.创建SAXParser对象
	        SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
	        //2.调用parser方法
	        /*
	         * 参数一:xml文档
	         * 参数二:DefaultHandler的子类
	         * */
	        DefaultHandler handler = new MyDefaultHandler();
	        parser.parse(new File("src/xxx.xml"),handler);
	    }
}

DOM与SAX的优缺点

dom解析: 优点:简单易学,可以对文档进行修改,如删除节点,增加节点等,灵活性较高,读取速度快,缺点:解析时,把整个xml文档读到内存中,占用较多资源。

sax解析: 优点:解析速度快,不需要直接读入整个文档,缺点:需要自己编写事件逻辑,使用麻烦,并且不能同时访问文档中的不同部分.使用范围:对于较大的文档有较好的解析能力,所以适用大文档的解析。

DOM4J解析

DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。

核心代码

// 默认从classpath中找文件(文件放在resources目录下),name不能带“/”,否则会抛空指针
			InputStream inStream = MainClass.class
					.getClassLoader().getResourceAsStream("xxx.xml");
					
			SAXReader saxReader = new SAXReader();// 1. 创建sax解析器
			org.dom4j.Document doc = saxReader.read(inStream);
			
			// 2. 获得org.dom4j.Document文档对象
			Element ele = doc.getRootElement();// 3.获得根节点
			
			// 4.使用迭代器对根节点下的子节点进行迭代
			Iterator<Element> it = ele.elementIterator();
			
			while (it.hasNext()) {
				// 取出当前的迭代的元素
				Element Ele = it.next();
				if("xxxs".equals(Ele.getName())){
					//获取xxxs元素下边的所有xxx,并使用迭代器进行遍历
					Iterator<Element> xxxIt = xxxEle.elementIterator();
					while(xxxIt.hasNext()){
						Element xxx=xxxIt.next();
						Attribute att=xxx.attribute("id");	//获取节点属性值					
						System.out.println("id为"+att.getValue()+"的xxx名称是:"+dog.element("name").getText());
					}
				}			
			}

DOM4J除了解析XML,还可以对XML元素进行增加,删除和更新。具体是调用Element的方法进行操作。例如删除一个id为1003的元素。

		for (Element element : elements) {
					String id = element.attributeValue("id");
					if ("1003".equals(id)) {
						// 删除自己:自杀的权利
						element.getParent().remove(element);
					}

		// 更新XML
			// 1 构建输出格式(设置缩进格式,设置添加是否换行)
			//OutputFormat compactFormat = OutputFormat.createCompactFormat(); //紧凑的格式
			OutputFormat prettyFormat = OutputFormat.createPrettyPrint(); //漂亮的格式
			// 2 构建XmlWriter
			XMLWriter writer = new XMLWriter(new FileOutputStream("xxxs.xml"), format);
			// 3 通过XmlWriter写出文档(从内存中写到磁盘)
			writer.write(doc);

使用Dom4j需要导入Dom4j的jar包。

猜你喜欢

转载自blog.csdn.net/weixin_44158992/article/details/108602485