zoukankan      html  css  js  c++  java
  • XML解析--DOM解析

    xml解析:用程序来读取xml的内容。

    xml的解析方式有两种:

    1、DOM解析

    2、SAX解析

    xml解析对应的工具大致有以下几种:

    DOM解析工具:

      1)JAXP(oracle-Sun公司官方)

      2)JDOM工具(非官方)

      3)Dom4J工具(非官方)三大框架默认读取xml的工具就是Dom4J

    SAX解析工具:

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

    DOM解析

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

    DOM(Document Object Model)文档对象模型,DOM的三层模型将html和xml定义成树形结构,文档中的标签、属性、文本等都封装成节点对象。

    节点对象:

    根节点:没有父节点的节点对象,xml中只有一个根节点。

    元素节点:根节点和根节点中的所有标签都是元素节点。

    属性节点:<student id=“001”></student> id就是属性节点。

    文本节点:<name>zhangsan</name> zhangsan就是文本节点

    注释节点:<!-- --> xml文档中的注释信息

    Dom4j使用

    Dom4j工具是非官方的,这里提供一个下载地址:http://pan.baidu.com/s/1c5WL0i

    Dom4j中集成的 XPath(路径查询语言)支持、 XML Schema(约束模式文档)支持。

    使用步骤:

    1)导入dom4j的核心包,dom4j-1.6.1.jar

    2)编写Dom4j读取xml文件的代码。

    Dom4j的体系结构

    常用方法API

    1)获取xml文档对象Document:

    1 File xmlFile = new File(“test.xml”);//找到文件
    2 SAXReader reader = new SAXReader(); //创建reader对象
    3 Document xmlDoc = reader.read(xmlFile); //读取xml文件,并生成document对象

    2)获取标签元素节点

    1 Element root = xmlDoc.getRootElement(); //获取根元素对象
    2 String elementName = root.getName(); //获取根元素的标签名
    3 lement element = root.element(“元素名称"); //通过元素名称获取第一个元素名称的对象
    4 List elementList = root.elements(); //获取所有这季节子元素的集合
    5 Iterator<Element> root.elementIterator("标签名");// 指定名称的所有子标签

    3)获取属性元素节点

    1 Attribute   attribute = element.attribute(“属性名称"); //通过属性名获取元素属性对象
    2 Attribute  attribute = element.attribute(0); //通过索引获取属性对象
    3 List  attributeList = root.attributes(); //获取所有属性对象集合
    4 Iterator<Attribute> root.attibuteIterator(); //获取所有属性对象
    5 String value = attribute.getValue(); //通过属性值
    6 String name = attribute.getName(); //通过属性名
    7 String  value = element.attributeValue(“属性名称”); //通过属性名来获取元素的属性值

    4)获取属性文本节点

    1 String text = element.getText(); //获取element元素的内部文本
    2 String text = element.elementText(“子元素名称”); //获取element子元素内部文本

    5)创建增加操作(文档对象、标签、属性、文本)

    1 Document document = DocumentHelper. createDocument(); //创建文档Document
    2 Element element = document.addElement(“元素名称"); //创建元素
    3 element. addAttribute(“属性名”,“属性值");  //创建属性--添加属性方法返回的是原元素对象。如同StringBuffer。
    4 element.addText(“文本"); //创建文本

    6)修改操作(属性、文本)

     1 //=====修改属性
     2 Element contactElem = doc.getRootElement().element("contact");
     3 Attribute idAttr = contactElem.attribute("id");
     4 idAttr.setValue("003"); //通过属性对象来修改属性值
     5 
     6 Element contactElem = doc.getRootElement().element("contact");
     7 contactElem.addAttribute("id", "004"); //通过添加的方式来进行覆盖修改
     8 
     9 //=====修改文本
    10 Element rootElem = doc.getRootElement().
    11 rootElem.setText("李四"); //修改文本

    7)删除操作(标签、属性、文本)

    1 remove(Element element) //删除标签
    2 remove(Attribute attribute)  //删除属性
    3 remove(Text text)  //删除文本

    8)写出xml文档

    1 FileOutputStream out = new FileOutputStream("e:/contact.xml"); //指定文件输出的位置
    2 //指定写出格式
    3 OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候
    4 //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候
    5 format.setEncoding("utf-8"); //指定生成的xml文档的编码,同时影响了xml文档保存时的编码  和  xml文档声明的encoding的编码(xml解析时的编码)
    6 XMLWriter writer = new XMLWriter(out,format); 1.创建写出对象
    7 writer.write(doc); //写出对象
    8 writer.close(); //关闭流

     代码示例:

    1、把xml文档信息封装到对象中

    contact.xml文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <contactList>
     3     <contact id="001">
     4         <name>张三</name>
     5         <age>20</age>
     6         <phone>134222223333</phone>
     7         <email>zhangsan@qq.com</email>
     8         <qq>432221111</qq>
     9     </contact>
    10     <contact id="002">
    11         <name>李四</name>
    12         <age>20</age>
    13         <phone>134222225555</phone>
    14         <email>lisi@qq.com</email>
    15         <qq>432222222</qq>
    16     </contact>
    17 </contactList>
    View Code

    java文件

     1 import java.util.List;
     2 
     3 import org.dom4j.Document;
     4 import org.dom4j.Element;
     5 import org.dom4j.io.SAXReader;
     6 
     7 /**
     8  * 把xml文档信息封装到对象中
     9  * @author APPle
    10  *
    11  */
    12 public class Demo4 {
    13 
    14         public static void main(String[] args) throws Exception{
    15             List<Contact> list = new ArrayList<Contact>();
    16             
    17             //读取xml,封装对象
    18             SAXReader reader = new SAXReader();
    19             Document doc = reader.read(new File("./src/contact.xml"));
    20             //读取contact标签
    21             Iterator<Element> it = doc.getRootElement().elementIterator("contact");
    22             while(it.hasNext()){
    23                 Element elem = it.next();
    24                 //创建Contact
    25                 Contact contact = new Contact();
    26                 contact.setId(elem.attributeValue("id"));
    27                 contact.setName(elem.elementText("name"));
    28                 contact.setAge(elem.elementText("age"));
    29                 contact.setPhone(elem.elementText("phone"));
    30                 contact.setEmail(elem.elementText("email"));
    31                 contact.setQq(elem.elementText("qq"));
    32                 list.add(contact);
    33             }
    34             
    35             for (Contact contact : list) {
    36                 System.out.println(contact);
    37             }
    38         }
    39 }
    View Code

    2、新建xml文档,并修改和删除里面的内容

    创建xml文档的java代码:

     1 public void createXMLDocument() throws Exception{
     2         //1.内存创建xml文档
     3         Document doc = DocumentHelper.createDocument();
     4         
     5         //2.写入内容
     6         Element rootElem = doc.addElement("Students");
     7         
     8         //2.1 增加标签
     9         Element studentElem1 = rootElem.addElement("Student");
    10         //2.2 增加属性
    11         studentElem1.addAttribute("id", "1");
    12         //2.3 增加标签,同时设置文本
    13         studentElem1.addElement("name").setText("张三");
    14         studentElem1.addElement("gender").setText("男");
    15         studentElem1.addElement("grade").setText("计算机1班");
    16         studentElem1.addElement("address").setText("广州");
    17         
    18         //2.1 增加标签
    19         Element studentElem2 = rootElem.addElement("Student");
    20         //2.2 增加属性
    21         studentElem2.addAttribute("id", "2");
    22         //2.3 增加标签,同时设置文本
    23         studentElem2.addElement("name").setText("李四");
    24         studentElem2.addElement("gender").setText("女");
    25         studentElem2.addElement("grade").setText("计算机2班");
    26         studentElem2.addElement("address").setText("北京");
    27         
    28         
    29         //3.内容写出到xml文件
    30         //3.1 输出位置
    31         FileOutputStream out = new FileOutputStream("e:/student.xml");
    32         //3.2 指定格式
    33         OutputFormat format = OutputFormat.createPrettyPrint();
    34         // 设置编码
    35         format.setEncoding("utf-8");
    36         XMLWriter writer = new XMLWriter(out,format);
    37         //3.3 写出内容
    38         writer.write(doc);
    39         //3.4关闭资源
    40         writer.close();
    41         
    42     }
    View Code

    修改标签内容

     1 public void changeContent() throws Exception{
     2         //1.查询到id为2的学生
     3         Document doc = new SAXReader().read(new File("e:/student.xml"));
     4         //1.1 找到所有的Student标签
     5         Iterator<Element> it = doc.getRootElement().elementIterator("Student");
     6         while(it.hasNext()){
     7             Element stuElem = it.next();
     8             //1.2 查询id为id的学生标签
     9             if(stuElem.attributeValue("id").equals("2")){
    10                 stuElem.element("name").setText("王丽");
    11                 break;
    12             }
    13         }
    14     
    15         
    16         //3.1 输出位置
    17         FileOutputStream out = new FileOutputStream("e:/student.xml");
    18         //3.2 指定格式
    19         OutputFormat format = OutputFormat.createPrettyPrint();
    20         // 设置编码
    21         format.setEncoding("utf-8");
    22         XMLWriter writer = new XMLWriter(out,format);
    23         //3.3 写出内容
    24         writer.write(doc);
    25         //3.4关闭资源
    26         writer.close();
    27     }
    View Code

    删除标签

     1 public void deleteContent() throws Exception{
     2         //1.查询到id为2的学生
     3         Document doc = new SAXReader().read(new File("e:/student.xml"));
     4         //1.1 找到所有的Student标签
     5         Iterator<Element> it = doc.getRootElement().elementIterator("Student");
     6         while(it.hasNext()){
     7             Element stuElem = it.next();
     8             //1.2 查询id为id的学生标签
     9             if(stuElem.attributeValue("id").equals("2")){
    10                 //1.3 删除该学生标签
    11                 stuElem.detach();
    12                 break;
    13             }
    14         }
    15     
    16         
    17         //3.1 输出位置
    18         FileOutputStream out = new FileOutputStream("e:/student.xml");
    19         //3.2 指定格式
    20         OutputFormat format = OutputFormat.createPrettyPrint();
    21         // 设置编码
    22         format.setEncoding("utf-8");
    23         XMLWriter writer = new XMLWriter(out,format);
    24         //3.3 写出内容
    25         writer.write(doc);
    26         //3.4关闭资源
    27         writer.close();
    28     }
    View Code
  • 相关阅读:
    Atitit nosql的艺术 attilax著作 目录 1. 1.5NoSQL数据库的类型 1 1.1. 1.5.1键值(Key/Value)存储 1 1.2. 1.5.2面向文档的数据库 1 1
    Atitit 常见信息化系统类别erp mes crm cms oa 目录 1.  企业资源规划(ERP)、客户关系管理(CRM)、协同管理系统(CMS)是企业信息化的三大代表之作 1 2. 概
    Atitit 信息管理概论 艾提拉总结 信息的采集 信息格式转换 信息整合 信息的tag标注 信息的结构化 信息检索,,索引 压缩 信息分析 汇总 第1章 信息管理的基本概念 第
    Atitit 产品化法通则 目录 1. 何谓软件产品化? 1 2. 产品化优点 vs 项目化 2 2.1. 软件复用率提高 2 2.2. ,项目化交付 2 2.3. 维护成本高 2 3. 产品金字塔
    Atitit 人工智能 统计学 机器学习的相似性 一些文摘收集 没有人工智能这门功课,人工智能的本质是统计学和数学,就是通过机器对数据的识别、计算、归纳和学习,然后做出下一步判断和决策的科学
    Atitit mybatis spring整合。读取spring、yml、文件的mysql url 步骤,读取yml,文件,使用ongl定位到url pwd usr 读取mybatis模板配置,
    关于一个大型web系统构架图的理解
    关于《王福朋petshop4.0视频教程》下载的更新
    不完全接触Node.js
    毕业设计那些事
  • 原文地址:https://www.cnblogs.com/nicker/p/6432902.html
Copyright © 2011-2022 走看看