Java xml的解析方法

xml

xml文件格式创建

xml文件解析的几种方式

xml文件创建的格式以及要求

  1. 必须有XML声明语句,并且必须放在第一行
<?xml version="1.0" encoding="UTF-8" ?>
  1. 所有标签必须是成对的 , 有且必须只有一个根元素|根节点 , XML文件标签必须严格区分大小写
<Persons></Persons>
<Persons><persons>// 这样就是没有区分大小写,所以不是一对标签
  1. xml属性的值必须使用单引号或者双引号, 元素要正确嵌套
<person ID = "1"></person>

XML的解析

XML解析有四种方法

  1. DOM方式解析

  2. SAX方式解析

  3. JDOM方式解析

  4. DOM4J方式解析

  • XML文件
<?xml version="1.0" encoding="UTF-8" ?>

<Persons>
    <person id = "1">
        <name>liuchang</name>
        <age>23</age>
    </person>
    <person id = "2">
        <name>sunjingheng</name>
        <age>26</age>
    </person>
    <person id = "3">
        <name>zhangyafeng</name>
        <age>30</age>
    </person>
</Persons>


  1. DOM方式解析
package day19;

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;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;

/*
    xml解析
    读取xml文件中的数据(节点名,属性,节点之间的文本)
    使用DOM方式解析xml
    DOM解析xml比较耗资源,适用于多次访问xml
 */
public class XMLDOMJieXiDemo01 {

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        // 1. 创建一个DocumentBuilderFactory的对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 2. 创建一个DocumentBuilder对象
        DocumentBuilder db = dbf.newDocumentBuilder();
        // 3. 通过DocumentBuilder的parse(...)方法得到Document对象
        Document doc = db.parse("src/day19/Persons.xml");
        // 4. 通过getElementsByTagName(...)方法获取得到节点的列表
        // Elements   有个 s 是为了有可能得到多个节点
        NodeList personList = doc.getElementsByTagName("person");
        //System.out.println(person.getLength());// 当前有三个person的节点
        // 所以当前要使用for循环遍历一下
        // 5. 通过for循环遍历每一个节点
        for (int i = 0; i < personList.getLength(); i++) {
            // 6. 得到每个节点的属性和属性值
            Node person = personList.item(i);
            NamedNodeMap attrs = person.getAttributes();// 得到属性的集合
            // 循环遍历每一个属性
            for (int j = 0; j < attrs.getLength(); j++) {
                // 得到每一个属性
                Node id = attrs.item(j);
                System.out.println("属性的名称 : " + id.getNodeName() + "\t" + id.getNodeValue());
            }
        }
        System.out.println("\n每个节点的名和节点的值");
        // 7. 得到每个节点的节点名和节点值
        for (int i = 0; i < personList.getLength(); i++) {
            // 得到每一个person的节点
            Node person = personList.item(i);
            NodeList subNode = person.getChildNodes();
            System.out.println("子节点的个数 :" + subNode.getLength());
            // 使用for循环遍历每一个person的子节点
            for (int j = 0; j <subNode.getLength() ; j++) {
                Node childNode = subNode.item(j);
                //System.out.println(childNode.getNodeName());
                // 判断得到的节点的类型
                short type = childNode.getNodeType();// 获取节点的类型
                // 判断获取的节点的类型
                if (type == Node.ELEMENT_NODE){
                    System.out.println("节点的名称 :" + childNode.getNodeName() + "\t" + childNode.getTextContent());
                }
            }
        }
    }

}

  1. SAX方式解析
  1. JDOM方式解析
package day19;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

/*
    xml解析
    JDOM方式解析
    这是第三方提供的解析xml的工具包
    基于树型结构,利用纯Java的技术对xml文档实现解析,所以只适合Java语言
 */
public class XMLJDOMJieXiDemo03 {

    public static void main(String[] args) throws IOException, JDOMException {
        // 1. 创建SAXBuilder对象
        SAXBuilder sb = new SAXBuilder();
        // 2. 调用build方法,得到Document对象(通过IO流)
        Document doc = sb.build(new FileInputStream("src/day19/persons.xml"));
        // 3. 获取节点
        Element root = doc.getRootElement();// Person元素
        // 4. 获取根节点的直接子节点的集合
        List<Element> personEle = root.getChildren();// person两个person
        // 5. 遍历集合
        for (int i = 0; i <personEle.size() ; i++) {
            Element person = personEle.get(i);
            // 得到属性集合
            List<Attribute> attList = person.getAttributes();
            // 遍历属性的集合得到每一个属性
            for(Attribute attr : attList){
                System.out.println(attr.getName() + "\t" + attr.getValue());
            }
        }
        // 得到每一个子节点
        System.out.println("--------------------------");
        for (int i = 0; i < personEle.size(); i++) {
            Element person = personEle.get(i);
            List<Element> subperson = person.getChildren();// 得到的是节点的集合
            // 遍历每一个节点,获取节点名称节点值
            for(Element ele : subperson){
                System.out.println(ele.getName() + "\t" + ele.getValue());
            }
            System.out.println("==================================");
            
        }
    }
}

  1. DOM4J方式解析
package day19;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.Iterator;

/*
    xml解析
    DOM4J是一个Java的XML API,是JDOM的升级品,用来读写XML文件的
    也是只适合于Java语言
    使用DOM4J需要导入DOM4J的jar包
 */
public class XMLDom4jDemo04 {

    public static void main(String[] args) throws DocumentException {
        // 1. 创建SAXReader对象
        SAXReader reader = new SAXReader();
        // 2. 调用read方法
        Document doc = reader.read(new File("src/day19/persons.xml"));
        // 3. 获取根元素
        Element root = doc.getRootElement();
        // 4. 通过迭代器遍历直接节点
        for(Iterator<Element> itePerson = root.elementIterator();itePerson.hasNext();){
            Element personEle = itePerson.next();
            //System.out.println(personEle.getName() + "\t" + personEle.getText());
            // 得到person的属性
            for(Iterator<Element> subPerson = personEle.elementIterator();subPerson.hasNext();){
                // 得到每一个子元素
                Element subEle = subPerson.next();
                System.out.println(subEle.getName() + "\t" + subEle.getText());
            }
            System.out.println("\n-------------------------------");
        }
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_45561352/article/details/107452986
今日推荐