Day 25:XML解析

本文介绍使用DOM4J工具解析XML文件的方法,包括如何读取XML文档、获取标签及属性值、提取文本内容等,并提供了详细的代码示例。

XML解析

  xml文件除了给开发者看,更多的情况使用程序读取xml文件的内容。这叫做xml解析

XML解析方式(原理不同) 

  DOM解析

  SAX解析

XML解析工具

  DOM解析原理:

             JAXP (oracle-Sun公司官方)

             JDOM工具(非官方)

             Dom4J工具(非官方)

             三大框架(默认读取xml的工具就是Dom4j)

              .......

  SAX解析原理:

              sax解析工具(oracle-sun公司官方)

什么是DOM解析

  DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

  Dom4j工具

 

  非官方,不在jdk中。

 

              使用步骤:

                      导入dom4j的核心包。 dom4j-1.6.1.jar

                       编写Dom4j读取xml文件代码

被读取文件

<?xml version="1.0" encoding="utf-8"?>
<contactList>
    <contact id="001">
        <name>张三</name>
        <age>20</age>
        <phone>134222223333</phone>
        <email>zhangsan@qq.com</email>
        <qq>432221111</qq>
    </contact>
    <contact id="002">
        <name>lisi</name>
        <age>20</age>
        <phone>134222225555</phone>
        <email>lisi@qq.com</email>
        <qq>432222222</qq>
    </contact>
</contactList>
//编写文件读取
import
java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Dom4j_read { public static void main(String[] args) { try { //1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); //2.读取xml文档,返回Document对象 Document doc = reader.read(new File(".\\src\\contact.xml")); System.out.println(doc); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(); } } }

无法将所有标签读取,使用迭代和递归就可以

import java.io.File;
import java.util.Iterator;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

public class Demo1 {
    /*@Test
    public void test1() throws Exception {
         SAXReader reader = new SAXReader();
         Document doc = reader.read(new File("./src/contact.xml"));
         //nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
         Iterator<Node> it = doc.nodeIterator();
         while(it.hasNext()) {
             Node node = it.next();
             String name = node.getName();
             System.out.println(name);
             
             //继续取出其下面的子节点
            //只有标签节点才有子节点
            //判断当前节点是否是标签节点
             if(node instanceof Element) {
                 Element elem = (Element)node;
                 Iterator<Node> it1 = elem.nodeIterator();
                 while(it1.hasNext()) {
                     Node node1 = it1.next();
                     System.out.println(node1.getName());
                 }
             }
         }    
     }*/
    @Test
    public void test2() throws Exception {
        SAXReader reader = new SAXReader();
         Document doc = reader.read(new File("./src/contact.xml"));
         Element rootelem = doc.getRootElement();
         getChildNode(rootelem);
         
     }
    
    private void getChildNode(Element elem) {
        System.out.println(elem.getName());
        Iterator<Node> it = elem.nodeIterator();
        while(it.hasNext()) {
            Node node = it.next();
            if(node instanceof Element){
                Element el = (Element)node;
                getChildNode(el);
            }
        }
    } 
 }

 Domj4读取xml文件

节点:Iterator  Element.nodeIterator();  //获取当前标签节点下的所有子节点

标签:

        Element  Document.getRootElement();  //获取xml文档的根标签              

        Element   ELement.element("标签名") //指定名称的第一个子标签

        Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签

        List<Element> Element.elements(); //获取所有子标签                   

@Test//获取标签
    public void text3() throws Exception {
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        
        //2.得到根标签,得到标签名称
        Element rootelem = doc.getRootElement();
        String name = rootelem.getName();
        System.out.println(name);
        
        //3.得到当前标签下指定名称的第一个子标签
        /*Element contactelem = rootelem.element("contact");
        System.out.println(contactelem.getName());*/
        
        /*//4.得到当前标签下指定名称的所有子标签
        Iterator<Element> it = rootelem.elementIterator("contact");
        while(it.hasNext()){
            Element elem = it.next();
            System.out.println(elem.getName());
        }*/
        //5.得到当前标签下的的所有子标签
        List<Element> list = rootelem.elements();
        for(int i=0;i<list.size();i++){
            Element e = list.get(i);
            System.out.println(e.getName());
        }
        for(Element e:list){
            System.out.println(e.getName());
        }
        
        Iterator<Element> it = list.iterator();
        while(it.hasNext()){
            Element elem = it.next();
            System.out.println(elem.getName());
        }
    }

属性:

       String   Element.attributeValue("属性名") //获取指定名称的属性值

       Attribute    Element.attribute("属性名");//获取指定名称的属性对象      

            Attribute.getName()  //获取属性名称

            Attibute.getValue()  //获取属性值

        List<Attribute>         Element.attributes();  //获取所有属性对象

        Iterator<Attribute>          Element.attibuteIterator(); //获取所有属性对象

 

@Test//获取属性
    public void test4() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        
        //获取属性:(先获的属性所在的标签对象,然后才能获取属性)
        //1.得到标签对象
        Element contactElem = doc.getRootElement().element("contact");
        //2.得到属性
        //2.1  得到指定名称的属性值
        
        String idValue = contactElem.attributeValue("id");
        System.out.println(idValue);

        //2.2 得到指定属性名称的属性对象
        Attribute idAttr = contactElem.attribute("id");
        //getName: 属性名称    getValue:属性值
        System.out.println(idAttr.getName() +"=" + idAttr.getValue());
        
        //2.3 得到所有属性对象,返回LIst集合
        List<Attribute> list = contactElem.attributes();
        //遍历属性
        for (Attribute attr : list) {
            System.out.println(attr.getName()+"="+attr.getValue());
        }
        
        //2.4 得到所有属性对象,返回迭代器
        Iterator<Attribute> it = contactElem.attributeIterator();
        while(it.hasNext()){
            Attribute attr = it.next();
            System.out.println(attr.getName()+"="+attr.getValue());
        }
    }

文本:

       Element.getText();  //获取当前标签的文本

       Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容

@Test//获取文本
    public void test5() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();        
        Document doc = reader.read(new File("./src/contact.xml"));
        
        //注意: 空格和换行也是xml的内容
        String content = doc.getRootElement().getText();
        System.out.println(content);
        
        //获取文本(先获取标签,再获取标签上的文本)
        Element nameELem = 
            doc.getRootElement().element("contact").element("name");
        //1. 得到文本
        String text = nameELem.getText();
        System.out.println(text);
        
        //2. 得到指定子标签名的文本内容
        String text2 = 
            doc.getRootElement().element("contact").elementText("phone");
        System.out.println(text2);
        
    }

 

转载于:https://www.cnblogs.com/JYDesigner/p/9455260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值