目录

Java高级编程-XML

Java高级编程–XML

Java高级编程–XML

1.XML简介

  • XML(EXtensible Markup Language),可扩展标记语言

  • 特点

    • XML与操作系统、编程语言的开发平台无关
    • 实现不同系统之间的数据交换
  • 作用

    • 数据交互
    • 配置应用程序和网站
    • Ajax基石

2.XML文档结构

XML文档结构:

  • 声明:XML 声明文件的可选部分,若存在需要放在文档的第一行
  • 文档描述信息
<?xml version="1.0" encoding="UTF-8"?>   //声明
声明version:文档符合xml1.0规范
  	 encoding:文档字符编码默认为UTF-8
<books>
    <!--图书信息 -->
    <book id="bk101">
        <author>王珊</author>
        <title>.NET高级编程</title>
        <description>包含C#框架和网络编程等</description>
    </book>
    <book id="bk102">
        <author>李明明</author>
        <title>XML基础编程</title>
        <description>包含XML基础概念和基本作用</description>
    </book>
</books>
文档结构解释
  XML文档必须有一个根元素
  根元素的开始标签放在最前面
  根元素的结束标签放在最后面
  标签内容在开始标签和结束标签之间
  元素可以包含属性属性提供有关元素的附加信息

3.XML标签

  • XML文档内容由一系列标签元素组成

    • 属性值用双引号包裹

      <元素名 属性名=“属性值”>元素内容</元素名>
      eg:
      <student id="001">
              <name>王显明</name>
              <expectedscore>75</expectedscore>
              <actualscore>80</actualscore>
      </student>
    • 一个元素可以有多个属性

    • 属性值中不能直接包含<&

    • 不建议使用的字符:>

空元素
<name>  </name>
<name></name>
<name/>

4.XML编写注意事项

  • 所有XML元素都必须有结束标签

  • XML标签对大小写敏感

  • XML必须正确的嵌套

  • 同级标签以缩进对齐

  • 元素名称可以包含字母、数字或其他的字符

  • 元素名称不能以数字或者标点符号开始

  • 元素名称中不能含空格

  • 实体引用来代替 特殊字符

    &lt;<less than
    &gt;>greater than
    &amp;&ampersand
    &apos;apostrophe
    &quot;"quotation mark
  • XML 中的注释

    <!--This is a comment -->
  • 避免-字符

  • 避免.字符

  • 避免:字符

5.XML解析器

  • 解析器类型
    • 非验证解析器
      • 检查文档格式是否良好
    • 验证解析器
      • 使用DTD检查文档的有效性

6.XML命名空间

  • XML命名空间的作用
    • 解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素

7.解析XML技术

  • DOM
    • 基于XML文档树结构的解析
    • 适用于多次访问的XML文档
    • 特点:比较消耗资源
  • SAX
    • 基于事件的解析
    • 适用于大数据量的XML文档
    • 特点:占用资源少,内存消耗小
  • DOM4J
    • 非常优秀的Java XML API
    • 性能优异、功能强大
    • 开放源代码

7.1DOM解析XML

  • DOM介绍

    • 文档对象模型(Document Object Model)
    • DOM把XML文档映射成一个倒挂的树
      https://i-blog.csdnimg.cn/direct/79234a0af6bf4d0d9139b6c9c6d8cfaa.png#pic_center
  • 常用接口介绍

    • DOM解析包:org.w3c.dom
常用接口常用方法说明
Document:表示整个 XML 文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Document:表示整个 XML 文档Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML 文档中的一个元素String getTagName()获取元素名称
  • 访问DOM树节点

  • DOM解析XML文件步骤

    • 创建解析器工厂对象
    • 解析器工厂对象创建解析器对象
    • 以Document对象为起点操作DOM树
    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book>
            <name>Java程序设计</name>
            <author>王显明</author>
            <price>50</price>
        </book>
        <book >
            <name>Java基础</name>
            <author>黑马程序员</author>
            <price>50</price>
        </book>
        <book>
            <name>数据结构</name>
            <author>严蔚敏</author>
            <price>70</price>
        </book>
    </books>
    package com.hz.ch10;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.NodeList;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    public class Test {
        public static void main(String[] args) {
            try{
                //创建DocumentBuilderFactory对象
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                //创建DocumentBuilder对象
                DocumentBuilder db = dbf.newDocumentBuilder();
                //解析XML文档,返回Document对象
                Document d=db.parse("book.xml");
                //获取根元素
                d.getDocumentElement().normalize();
                //获取所有book元素
                Element element=d.getDocumentElement();
                NodeList nodeList=element.getElementsByTagName("book");
                for (int i = 0; i < nodeList.getLength(); i++) {
                    System.out.println(nodeList.item(i).getTextContent());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
  • 保存XML文件

    • 获得TransformerFactory对象
    • 创建Transformer对象
    • 创建DOMSource对象
      • 包含XML信息
    • 设置输出属性
      • 编码格式
    • 创建StreamResult对象
      • 包含保存文件的信息
    • 将XML保存到指定文件中
  • 添加DOM节点

  • 修改/删除DOM节点

7.2DOM4J解析XML

7.2.1常用方法
  • org.dom4j.Document常用方法

    • 获取根节点

      Element getRootElement();
  • org.dom4j.Element的常用方法

    • 返回标签的名称

      String getName();
    • 获取当前节点下所有子节点

      List<Element>  elements();
    • 获取指定属性名称的属性值

      String attributeValue(String name)
    • 获取标签文本

      String getText()
    • 获取指定名称的子标签的文本

      String elementText(String name);
    • 设置XML编码

      OutputFormat format = OutputFormat.createPrettyPrint();
      format.setEncoding("UTF-8");
    • 新XML添加Documen对象

       Document document = DocumentHelper.createDocument();
    • 创建节点Element对象.addElement(“节点名”)

       Element apple = fruit.addElement("apple");
    • 节点添加,修改属性Element对象

      addAttribute("节点属性名",“属性值)
      apple.addAttribute("type", "red");
7.2.2创建一个新的XML文档并设置XML编码将文档写入文件
package com.hz.ch10.dom4jtest01;
/**
 * 创建XML文件
 */
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import java.io.FileWriter;
import java.io.IOException;

public class Test01 {
    public static void main(String[] args) {
        //创建Document对象
        Document document = DocumentHelper.createDocument();
        //添加根元素
        Element fruit = document.addElement("fruit");
        //添加子元素
        Element apple = fruit.addElement("apple");
        //添加属性
        apple.addAttribute("type", "red");
        apple.addElement("name").addText("红富士");
        apple.addElement("weight").addText("0.5kg");
        Element mango = fruit.addElement("mango").addAttribute("type", "yellow");
        mango.addElement("name").addAttribute("id", "1001").addText("芒果");
        mango.addElement("weight").addText("0.3kg");
        //写出到文件
        try {
            FileWriter fw = new FileWriter("fruit1.xml");
            XMLWriter xmlWriter = new XMLWriter(fw);
            xmlWriter.write(document);
            xmlWriter.close();
            fw.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //格式化输出
        OutputFormat of =null;
        XMLWriter xmlWriter=null;
        try {
            FileWriter fw = new FileWriter("fruit2.xml");
            of  = OutputFormat.createPrettyPrint();
            xmlWriter = new XMLWriter(fw, of);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //紧凑输出
        try {
            of=OutputFormat.createCompactFormat();
            xmlWriter=new XMLWriter(System.out,of);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
7.2.3解析XML文件
package com.hz.ch10.dom4jtest01;

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

import java.util.Iterator;

/**
 * 解释XML文件
 */
public class Test02 {
    public static void main(String[] args) {
        try {
            //解析器
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read("fruit1.xml");
            //获取根元素
            Element fruit = document.getRootElement();
           //遍历根的子元素
            Iterator<Element> it = fruit.elementIterator();
            while (it.hasNext()){
                Element element = it.next();
                System.out.println(element.getName()+"的属性:"+element.attributeValue("type"));
            }
            
            //遍历元素名为“apple”的根的子元素
            Iterator<Element> elementIterator = fruit.elementIterator("apple");
            while (elementIterator.hasNext()){
                Element element = elementIterator.next();
                System.out.println(element.getName()+"的属性:"+element.attributeValue("type"));
            }
            
            
         //遍历3
            Iterator<Element> elementIterator = fruit.elementIterator();
            while (elementIterator.hasNext()) {
                Element child = elementIterator.next();
                //获取当前子元素下的<name>标签
                Element name = child.element("name");
                //获取<name>标签的文本内容
                String text = name.getText();
                System.out.println(child.getName() + "的名称:" + text);
                //获取当前子元素下的<weight>标签
                Element weight = child.element("weight");
                System.out.println(child.getName() + "的重量:" + weight.getText());
                String id = name.attributeValue("id");
                if (id != null) {
                    System.out.println(child.getName() + "的id:" + id);
                }

            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • DOM4J解析XML工具类
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileWriter;
import java.util.List;

public class UtilsXML {
    private  static Document document=null;

    /**
     * 初始化
     * @param path
     * @throws Exception
     */
    public static void info(String path) throws Exception {
        //构建XML的解析器
        SAXReader saxReader = new SAXReader();
        //读取XML文件  返回Document对象
        document = saxReader.read(path);
    }

    /**
     * 新增XML
     */
    public static void saveXML(){
       document = DocumentHelper.createDocument();
        Element root = document.addElement("books");
        Element book = root.addElement("book").addAttribute("id", "1001");
        book.addElement("name").setText("Java");
    }
    /**
     * 读取XML
     */
    public static void findXML(){
        Element root = document.getRootElement();
        List<Element> elementList= root.elements();
        for (Element element : elementList) {
            String id=element.attributeValue("type");
            System.out.println("-----"+id+"------");
            //获取子元素
            List<Element> elementList1 = element.elements();
            for (Element element1 : elementList1) {
                System.out.println(element1.getName()+""+element1.getText());
            }

        }

    }

    /**
     * 编辑XML
     */
    public static void editXML() throws Exception {
        Element rootElement = document.getRootElement();
        List<Element> elementList = rootElement.elements();
        for (Element element : elementList) {
            if(element.attributeValue("type").equals("yellow")){
                element.element("name").setText("mango");
            }
        }
        Element grape = rootElement.addElement("grape");
        grape.addAttribute("type","purple");
        grape.addElement("name").setText("葡萄");
        grape.addElement("weight").setText("0.1kg");
        //保存XML
        outputXML("fruit2.xml");

    }
    /**
     * 删除XML
     */
    public static void delXML() throws Exception {
        Element rootElement = document.getRootElement();
        List<Element> elementList = rootElement.elements();
        for (Element element : elementList) {
            if(element.attributeValue("type").equals("purple")){
                element.getParent().remove(element);
            }

        }
        //保存XML
        outputXML("fruit2.xml");

    }

    /**
     * 写入XML
     * @param path
     * @throws Exception
     */


    public static void outputXML(String path) throws Exception {
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileWriter(path),outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();

    }


    public static void main(String[] args) {
        try {
            info("fruit2.xml");
            //findXML();
            //editXML();
            delXML();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}