解析XML的四种方式

概述

XML文档是我们平时项目中最常用的配置方式。虽然现在springBoot提倡简化配置,去掉了众多繁杂的XML等配置。但在很多其他地方,如自定义的配置和信息设置,还是会使用到XML。
这里,就来介绍以下XML文档的四种解析方式:

  • Dom
  • SAX
  • JDOM
  • dom4j
1、【dom】

DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
以下是个简单的使用例子:(主要通过创建Document,将xml转换为Document来进行读取解析)

	//1.获取DOM 解析器的工厂实例。  
    DocumentBuilderFactory factory  = DocumentBuilderFactory.newInstance();  
    //2.获得具体的DOM解析器。  
    DocumentBuilder builder = factory.newDocumentBuilder();  
    //3.获取文件  
    Document document = builder.parse(new File("testXML.xml"));  
	//4.获取根元素  
    Element root = document.getDocumentElement();  
    System.out.println("name="+root.getAttribute("name"));  
    //5.获取根节点[有多个节点]  
    NodeList list = root.getElementsByTagName("par");  

    for (int i = 0; i < list.getLength(); i++) {  
        System.out.println("---------------");  
        Element par =  (Element) list.item(i);  
        System.out.println("id=" + par .getAttribute("id"));  
          
        //获取子节点集合  
        NodeList clist = par .getChildNodes();  
        for (int j = 0; j < clist.getLength(); j++) {  
            //获取下标  
            Node c = clist.item(j);  
            //把空格删除[获取属性名和值]  
            if (c instanceof Element) {  
                System.out.println(c.getNodeName()+"="+c.getTextContent());  
            }  
        }  
    }  
2、【dom4j】

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的,dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件。
以下是个简单的使用例子:

	/** 创建:
        1. 设置根节点: DocumentHelper.createElement("根节点名");
        2. 读取doucment元素:DocumentHelper.createDocument(root);
        3. 添加根节点:addAttribute("name", "value");  
        4. 添加字节点、赋值:addElement("name");  setText("value");
        5. 添加到根节点:XMLWriter xmlWriter = new XMLWriter();  xmlWriter.write(document);  
     **/
	// 创建文档并设置文档的根元素节点   
    Element root = DocumentHelper.createElement("books");  
    Document doucment = DocumentHelper.createDocument(root);  
    //根节点  
    root.addAttribute("name","bookvalue");  
    //子节点  
    Element element1 = root.addElement("author1 ");  
    element1.addAttribute( "name", "TOM" );  
    element1.addAttribute( "location", "CHN" );  
    element1.addText( "TOM MARK" );  
      
    Element element = root.addElement("author2 ");  
    element.addAttribute( "name", "JAMS" );  
    element.addAttribute( "location", "USA" );  
    element.addText( "JAMS TONY" );  
    //添加  
    XMLWriter xmlwriter2 = new XMLWriter();  
    xmlwriter2.write(doucment);  
    //创建文件  (这里代码有问题)
    OutputFormat format = new OutputFormat();  
    FileOutputStream file = new FileOutputStream("books.xml");  
    XMLWriter xml = new XMLWriter(file);  
    xml.close();  
    
    /** 读取:
    	1.获取SAM接口:SAXReader saxReader = new SAXReader();  
    	2.获取XML文档:  Document doc =  saxReader.read(new File("name.xml"));
    	3.获取根节点:Element root = doc.getRootElement();
    	4.获取子节点:root.elementIterator();
    	5.获取孙节点: attributeIterator();
    **/
	//1.获取SAM接口:  
	SAXReader saxReader = new SAXReader();  
    //2.获取XML文件:  
    Document doc = saxReader.read(new File("newxml.xml"));  
    //3.获取根节点:  
    Element root = doc.getRootElement();          
    System.out.println("根节点: " + root.getName());          
    System.out.println("----------------");      
    //获取子节点  
    Iterator<?> it = root.elementIterator();  
    while(it.hasNext()){  
        Element elem = (Element) it.next();  
        //获取属性名属性值  
        List<Attribute> li = elem.attributes();  
        for (Attribute att : li ) {  
            System.out.println(att.getName() + "  " + att.getValue() );  
        }             
        //获取子节的子节点  
        Iterator<?> ite = elem.elementIterator();  
        while(ite.hasNext()){  
            Element child = (Element) ite.next();  
            System.out.println(child.getName() + "  " + child.getStringValue());  
        }        
        System.out.println("----------------");  
    }  
3、【JDOM】

JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念等),把SAX和DOM的功能有效地结合起来。JDOM是用Java语言读、写、操作XML的新API函数。在直接、简单和高效的前提下,这些API函数被最大限度的优化。
以下是个简单的使用例子:

    //读取:==========================================================================
	//1.创建一个SAXBuilder的对象  
    SAXBuilder saxBuilder = new SAXBuilder();  
    //2.创建一个输入流,将xml文件加载到输入流中  
    InputStream in = new FileInputStream("Book.xml");             
    InputStreamReader isr = new InputStreamReader(in, "UTF-8");   
    //3.通过saxBuilder的build方法,将输入流加载到saxBuilder中  
    Document document = saxBuilder.build(isr);             
    //4.通过document对象获取xml文件的根节点  
    Element rootElement = document.getRootElement();  
    //5.获取根节点下的子节点的List集合  
    List<Element> elementList = rootElement.getChildren();  
    for (Element element : elementList) {  
        // 解析文件的属性集合  
        List<Attribute> list = element.getAttributes();  
        for (Attribute attr : list) {  
            // 获取属性名  
            String attrName = attr.getName();  
            // 获取属性值  
            String attrValue = attr.getValue();  
            System.out.println(attrName +"="+ attrValue);  
              
            // 对book节点的子节点的节点名以及节点值的遍历  
            List<Element> listChild = element.getChildren();  
            for (Element child : listChild) {  
                System.out.println(child.getName() +"="+child.getValue());  
            }        
        }  
    }  
    
    //创建:==========================================================================
	//1.生成一个根节点  
    Element root = new Element("TestXML");  
    //2.为节点添加属性  
    root.setAttribute("Par","ONE");  
    //3.生成一个document对象  
    Document document = new Document(root);  

    //添加元素  
    Element first= new Element("First");  
    first.setAttribute("id","1");  
    Element name = new Element("name");  
    name.setText("Ont");  
    first.addContent(name);  

    Element second= new Element("Second");  
    second.setText("Two");  
    first.addContent(second);  
    root.addContent(first);  

    //添加元素  
    Element third= new Element("Third");  
    third.setAttribute("id","1");  
    Element name2 = new Element("name");  
    name2.setText("three");  
    third.addContent(name2);  

    Element fourth = new Element("Fourth");  
    fourth.setText("four");  
    third.addContent(fourth );  
    root.addContent(third);  

    //格式   换行、编码  
    Format format = Format.getCompactFormat();  
    format.setIndent("");    
    format.setEncoding("GBK");  
      
    //4.创建XMLOutputter的对象  
    XMLOutputter outputer = new XMLOutputter(format);  
    try {  
        //5.利用outputer将document对象转换成xml文档  
        outputer.output(document, new FileOutputStream(new File("Booknews.xml")));  

        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
4、【SAX】

SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值