• Java读取XML文件


    使用Java读取XML文件有四种方式:

    1. DOM
    2. SAX
    3. JDOM
    4. DOM4j

    book.xml文件内容: 

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <书架>
     3     <>
     4         <书名 编号="a_1">JavaWeb程序开发入门</书名>
     5         <作者 分类="AA">传智播客</作者>
     6         <售价 单位="元">60</售价>
     7     </>
     8     <>
     9         <书名 编号="a_2">JavaWeb从入门到精通</书名>
    10         <作者 分类="BB">明日科技</作者>
    11         <售价>80</售价>
    12     </>
    13     <>
    14         <书名 编号="a_3">计算机文化基础</书名>
    15         <作者 分类="CC">山东商务</作者>
    16         <售价>40</售价>
    17     </>
    18 </书架>

    1.DOM

    DOM 解析 XML 的步骤:

    1) 创建一个 DocumentBuilderFactory 的对象。

    2) 创建一个 DocumentBuilder 对象。

    3) 通过DocumentBuilder的parse(...)方法得到Document对象。

    4) 通过 getElementsByTagName(...)方法获取到节点的列表。

    5) 通过 for 循环遍历每一个节点。

    6) 得到每个节点的属性和属性值。

    7) 得到每个节点的节点名和节点值。  

      NodeType解释:

      Node(节点)是DOM层次结构中的任何类型的对象的通用名称,Node有很多类型,如元素节点,属性节点,文本节点,注释节点等,通过NodeType区分,常见的有:

    节点类型NodeType
    元素element 1
    属性attribute 2
    文本text 3
    注释comment 8
    文档document 9
     1 import javax.xml.parsers.DocumentBuilder;
     2 import javax.xml.parsers.DocumentBuilderFactory;
     3 
     4 import org.w3c.dom.Document;
     5 import org.w3c.dom.Element;
     6 import org.w3c.dom.Node;
     7 import org.w3c.dom.NodeList;
     8 
     9 
    10 public class DomXmlDemo {
    11 
    12     // 用Element方式
    13     public static void element(NodeList list) {
    14         for (int i = 0; i < list.getLength(); i++) {
    15             Element element = (Element) list.item(i);
    16             NodeList childNodes = element.getChildNodes();
    17             for (int j = 0; j < childNodes.getLength(); j++) {
    18                 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
    19                     // 获取节点
    20                     System.out.print(childNodes.item(j).getNodeName() + ":");
    21                     // 获取节点值
    22                     System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
    23                 }
    24             }
    25         }
    26     }
    27 
    28     // 用Node方式
    29     public static void node(NodeList list) {
    30         for (int i = 0; i < list.getLength(); i++) {
    31             Node node = list.item(i);
    32             NodeList childNodes = node.getChildNodes();
    33             for (int j = 0; j < childNodes.getLength(); j++) {
    34                 if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
    35                     System.out.print(childNodes.item(j).getNodeName() + ":");
    36                     System.out.println(childNodes.item(j).getFirstChild().getNodeValue());
    37                 }
    38             }
    39         }
    40     }
    41 
    42     public static void main(String[] args) {
    43         // 1.创建DocumentBuilderFactory对象
    44         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    45         // 2.创建DocumentBuilder对象
    46         try {
    47             DocumentBuilder builder = factory.newDocumentBuilder();
    48             Document d = builder.parse("src/book.xml");
    49             NodeList sList = d.getElementsByTagName("书");
    50             element(sList);// Element方式
    51             // node(sList);
    52         } catch (Exception e) {
    53             e.printStackTrace();
    54         }
    55     }
    56 }

    运行结果:

     2.SAX 

    SAX 方式解析:以事件驱动的XML API,边扫描边解析,解析速度快占用内存少(逐行解析)。

    SAX 解析 XML 的步骤:

    1) 创建 SAXParserFactory 的对象。

    2) 创建 SAXParser 对象(解析器)。

    3) 创建一个 DefaultHandler 的子类,并且重写里面的方法。

    4) 调用 parse 方法,传入DefaultHandler的子类对象。

    DefaultHandler类解释:

    在DefaultHandler中有几个比较重要的方法。

    1. public void startDocument() throws SAXException

    第一个执行方法。

    2. public void startElement(String uri, String localName, String qName,   Attributes attributes) throws SAXException

    该方法是继第一个方法后第二个执行方法。

    3. public void characters(char[] ch, int start, int length)   throws SAXException

    这个是继startElement方法后的执行方法。

    该方法中的ch把所解析的xml的所有数据都保存进来,且ch初始化为2K数据。start是一个节点">"的位置。length就是">"到下一个"<"的长度。

    4. public void endElement(String uri, String localName, String qName)   throws SAXException

    若一个节点,比如<name>michael</name>,在执行完characters后会执行该方法。如果节点,比如<names><name>michael</name></names>在执行names节点时,不会执行到该方法。

    5. public void endDocument() throws SAXException

    最后一个执行方法。

     1 import javax.xml.parsers.SAXParser;
     2 import javax.xml.parsers.SAXParserFactory;
     3 
     4 import org.xml.sax.Attributes;
     5 import org.xml.sax.SAXException;
     6 import org.xml.sax.helpers.DefaultHandler;
     7 
     8 public class SaxXmlDemo {
     9 
    10     public static void main(String[] args) throws Exception {
    11         // 1.获取SAXParserFactory实例
    12         SAXParserFactory factory = SAXParserFactory.newInstance();
    13         // 2.获取SAXparser实例
    14         SAXParser saxParser = factory.newSAXParser();
    15         // 3.创建DefaultHandler的子类对象
    16         SAXDemoHandler handler = new SAXDemoHandler();
    17         // 4.调用parse()方法,传入DefaultHandler的子类对象
    18         saxParser.parse("src/book.xml", handler);
    19     }
    20 }
    21 
    22 class SAXDemoHandler extends DefaultHandler {
    23     // 遍历xml文件开始标签
    24     @Override
    25     public void startDocument() throws SAXException {
    26         super.startDocument();
    27         System.out.println("sax解析开始");
    28     }
    29 
    30     // 遍历xml文件结束标签
    31     @Override
    32     public void endDocument() throws SAXException {
    33         super.endDocument();
    34         System.out.println("sax解析结束");
    35     }
    36 
    37     @Override
    38     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    39         super.startElement(uri, localName, qName, attributes);
    40         if (qName.equals("书")) {
    41             System.out.println("============开始遍历=============");
    42         } else if (!qName.equals("书") && !qName.equals("书架")) {
    43             System.out.print("节点名称:" + qName); // 输出节点名称
    44             for (int i = 0; i < attributes.getLength(); i++) {
    45                 System.out.print(", 属性:" + attributes.getQName(i) + "=" + attributes.getValue(i));
    46             }
    47         }
    48     }
    49 
    50     @Override
    51     public void endElement(String uri, String localName, String qName) throws SAXException {
    52         super.endElement(uri, localName, qName);
    53         if (qName.equals("书")) {
    54             System.out.println(qName + ":遍历结束");
    55             System.out.println("============结束遍历============");
    56         }
    57     }
    58 
    59     @Override
    60     public void characters(char[] ch, int start, int length) throws SAXException {
    61         super.characters(ch, start, length);
    62         String value = new String(ch, start, length).trim();
    63         if (!value.equals("")) {
    64             System.out.println(", 节点内容:" + value); // 输出节点内容
    65         }
    66     }
    67 }

    运行结果:

     

    3.JDOM

    JDOM 解析:是一种解析XML的JAVA工具包,是基于树形结构,利用纯JAVA技术对XML文档实现解析,只适用于JAVA语言。

    JDOM解析XML的步骤:

    1) 创建一个 SAXBuilder 对象。

    2) 调用 build 方法,得到 Document 对象(通过 IO 流)。

    3) 获取根节点。

    4) 获取根节点的直接子节点的集合。

    5) 遍历集合。

     到 http://www.jdom.org/downloads/index.html 下载jar包,有1.1.3和2.0.6两个,我们下载,复制到项目的lib目录中,右键添加的Build Path中。

     

      

     1 import java.io.File;
     2 import java.io.FileInputStream;
     3 import java.io.InputStream;
     4 import java.util.List;
     5 
     6 import org.jdom2.Attribute;
     7 import org.jdom2.Document;
     8 import org.jdom2.Element;
     9 import org.jdom2.input.SAXBuilder;
    10 
    11 public class JdomXmlDemo {
    12 
    13     public static void main(String[] args) throws Exception {
    14         // 1.创建SAXBuilder对象
    15         SAXBuilder saxBuilder = new SAXBuilder();
    16         // 2.创建输入流
    17         InputStream is = new FileInputStream(new File("src/book.xml"));
    18         // 3.将输入流加载到build中
    19         Document document = saxBuilder.build(is);
    20         // 4.获取根节点
    21         Element rootElement = document.getRootElement();
    22         // 5.获取子节点
    23         List<Element> children = rootElement.getChildren();
    24         for (Element child : children) {
    25             List<Attribute> attributes = child.getAttributes();
    26             // 打印属性
    27             for (Attribute attr : attributes) {
    28                 System.out.println(attr.getName() + ":" + attr.getValue());
    29             }
    30             List<Element> childrenList = child.getChildren();
    31             System.out.println("======获取子节点-start======");
    32             for (Element e : childrenList) {
    33                 System.out.println("节点名:" + e.getName() + ", 节点值:" + e.getValue());
    34                 List<Attribute> childAttributes = e.getAttributes();
    35                 for (Attribute attr : childAttributes) {
    36                     System.out.println(attr.getName() + "=" + attr.getValue());
    37                 }
    38             }
    39             System.out.println("======获取子节点-end======");
    40         }
    41     }
    42 
    43 }

    运行结果:

     

    4.DOM4j

    DOM4J :DOM4J是一个JAVA的XML API,JDOM的升级版。

    DOM4J 解析 XML 的步骤:

    1) 创建 SAXReader 对象。

    2) 调用 read 方法。

    3) 获取根元素。

    4) 通过迭代器遍历直接节点。

    通常使用Dom4j工具进行XML的DOM解析,首先要到Dom4j的官网https://dom4j.github.io/下载包并加载到IDE开发工具中(例如eclipse)。

     1 import java.io.File;
     2 import java.util.Iterator;
     3 import java.util.List;
     4 
     5 import org.dom4j.Attribute;
     6 import org.dom4j.Document;
     7 import org.dom4j.Element;
     8 import org.dom4j.io.SAXReader;
     9 
    10 public class Dom4jXmlDemo {
    11 
    12     public static void main(String[] args) throws Exception {
    13         // 1.创建Reader对象
    14         SAXReader reader = new SAXReader();
    15         // 2.加载xml
    16         Document document = reader.read(new File("src/book.xml"));
    17         // 3.获取根节点
    18         Element rootElement = document.getRootElement();
    19         Iterator<Element> iterator = rootElement.elementIterator();
    20         while (iterator.hasNext()) {
    21             Element child = (Element) iterator.next();
    22             List<Attribute> attributes = child.attributes();
    23             System.out.println("======获取属性值-start======");
    24             for (Attribute attribute : attributes) {
    25                 System.out.println(attribute.getName() + "=" + attribute.getValue());
    26             }
    27             System.out.println("======获取属性值-end======");
    28             System.out.println("======遍历子节点-start======");
    29             Iterator<Element> childIterator = child.elementIterator();
    30             while (childIterator.hasNext()) {
    31                 Element e = (Element) childIterator.next();
    32                 System.out.println("节点名:" + e.getName() + ",节点值:" + e.getStringValue());
    33                 List<Attribute> childAttributes = e.attributes();
    34                 for (Attribute attr : childAttributes) {
    35                     System.out.println(attr.getName() + "=" + attr.getValue());
    36                 }
    37             }
    38             System.out.println("======遍历子节点-end======");
    39         }
    40     }
    41 }

    运行结果:

     


    四种解析 XML 的特点

    1.DOM 解析:

    形成了树结构,有助于更好的理解、掌握,且代码容易编写。解析过程中,树结构保存在内存中,方便修改。

    2.SAX 解析:

    采用事件驱动模式,对内存耗费比较小。适用于只处理 XML 文件中的数据时。

    3.JDOM 解析:

    仅使用具体类,而不使用接口。API 大量使用了 Collections 类。

    4.DOM4J解析:

    使用接口和抽象基本类方法。性能优异,灵活性好,功能强大和易于使用。



  • 相关阅读:
    drone 学习五 集成gitlab 配置以及简单测试
    ambassador kubernetes native api gateway
    使用distillery 实现版本的动态升级&& 动态降级
    使用distillery 构建专业的 phoenix 项目软件包
    mix deps HEX_HTTP_CONCURRENCY=1 HEX_HTTP_TIMEOUT=120 timeout
    elixir jenkins 集成构建方式配置
    phoenix 使用activerecord模式框架ecto 访问数据库
    phoenxi elixir 框架几个方便的命令
    phoenix elixir 框架简单试用
    k8s helm 私服chartmuseum minio s3 存储配置
  • 原文地址:https://www.cnblogs.com/lihuawei/p/14597518.html
Copyright © 2020-2023  润新知