Java进阶知识学习:Xml技术

目录,更新ing,学习Java的点滴记录

  目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录

Xml概念和体系

  1. Xml概念
     Xml是指可扩展标记语言(Extensible Markup Language)
     Xml没有预定义标签,需要自行定义标签
     预定义标签在HTML语言中十分常见,比如下面示例中,title标签指的就是网站的标题,功能是定义好的
      在这里插入图片描述
  2. Xml特点
     Xml数据以纯文本格式进行存储,实现了不同应用程序之间的数据通信;实现不同平台间的数据通信|数据共享,使用Xml将不同的程序|平台联系起来
  3. Xml作用:数据存储和数据传输
  4. Xml与Html区别:
     设计目的不同,Xml被设计为存储和传输数据,而Html设计为显示数据,关注数据的外观
  5. 用案例简单解释Xml结构
    在这里插入图片描述
    在这里插入图片描述
  6. Xml文件的体系
    在这里插入图片描述

Xml基本语法

  1. 基本语法
     1) 有且只有一个根元素
     2) Xml文档声明必须放在文档第一行
     3) 所有标签必须成对出现
     4) Xml标签严格区分大小写
     5) XML必须正确嵌套
     6) XML中的属性值必须加引号
     7) XML中,一些特殊字符需要使用“实体”
      在这里插入图片描述
     8) XML中可以应用适当的注释
  2. 元素
     1) XML元素指的是开始标签到结束标签的部分
     2) 一个元素中可以包含
      其他元素| 文本|属性|或者三者混合
  3. 命名规则
     1) 名称可以包含字母、数字及其他字符
     2) 名称不能以数字或者标点符号开始
     3) 名称不能以xml开始
     4) 名称不能包含空格
  4. 简单示例
    在这里插入图片描述

Schema技术介绍

  1. DTD验证
     1) 概念:DTD文档类型定义
     2) 作用:验证是否为"有效"的XML,对xml文档的书写内容进行规范约束
     3) 案例(了解即可,有更可靠的技术可以使用)
      在这里插入图片描述
      当你修改下面的标签时,如果不符合上面使用DTD描述的约束语法,则会报错
     4) 使用DTD局限性
      a. DTD不遵守XML语法
      b. DTD数据类型有限
      c. DTD不可扩展
      d. DTD不支持命名空间
  2. Schema技术
     1) Schema是DTD的代替者,名称为XML Schema,用于描述XML文档结构,比DTD更加强大,最主要的特征之一就是XML Schema支持数据类型
      a. Schema遵循XML的语法
      b. Schema可以用能处理XML文档的工具处理
      c. Schema大大扩充了数据类型,而且还可以自定义数据类型
      d. Schema支持元素的继承
      e. Schema支持属性组
     2) 示例
      在这里插入图片描述
      a. 所有的schema文档使用schema作为其根元素
      b. http://www.w3.org/2001/XMLSchema:表示用于验证当前schema文档的命名空间(用于验证schema本身)同时它还规定了来自命名空间http://www.w3.org/2001/XMLSchema的元素和数据类型应该使用前缀xs
      c. xmlns:相当于java中的import
      d. :xs : 在使用时要写"小名"作为前缀
      3. Xml使用schema验证,那schema也是一个xml,它由DTD来验证
     3) 使用Schema验证xml文档的步骤
      a. 创建SchemaFactory工厂
      b. 建立验证文件对象
      c. 利用SchemaFactory工厂对象,接收验证的文件对象,生成Schema对象
      d. 产生对此Schema的验证器
      e. 要验证的数据(准备数据源)
      f. 开始验证
     4) 示例代码
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      可以采用这种代码的方式对XML文件进行验证,实际上这样已经是没有必要的了,当你写好了上面的Animal.xsd和Animal.xml文件,并将Animal.xsd引入到了Animal.xml中,就会自动对你xml中的内容进行规范检查了
    &ems; 在这里插入图片描述
      上图就是自动检查的结果

4种解析XML数据的方式

  1. 什么叫解析:在java程序汇总读取xml文件的过程称为解析xml
  2. 解析方式
     1) DOM解析(java官方提供)
     2) SAX解析(java官方提供)
     3) JDOM解析(第三方提供)
     4) DOM4J解析(第三方提供)
  3. 解析案例的xml文件内容
<?xml version="1.0" encoding="UTF-8"?>

<animals xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Animals.xsd">
    <animal id="1001">
        <name>Dog</name>
        <age>11</age>
        <color>Black</color>
    </animal>
</animals>

DOM方式解析Xml数据

  1. 解析步骤
     1) 创建一个DocumentBuilderFactory的对象
     2) 创建一个DocumentBuilder的对象
     3) 通过DocumentBuilder的parse(…)方法得到Document对象
     4) 通过getElementsByTagName(…)方法获取到节点的列表
     5) 通过for循环遍历每一个节点
     6) 得到每个节点的属性和属性值
     7) 得到每个节点的节点名和节点值
  2. 示例代码
public class TestDOM {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
//        1.创建一个DocumentBuilderFactory的对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//        2.创建一个DOcumentBuilder的对象
        DocumentBuilder builder = factory.newDocumentBuilder();
//        3.通过DocumentBuilder的parse(...)方法得到Document对象
        Document document = builder.parse(new File("src/com/test/Animals.xml"));
//        4.通过getElementsByTagName(...)方法获取到节点的列表
        NodeList nodes = document.getElementsByTagName("animal");
        System.out.println("得到的animal节点个数为:"+nodes.getLength());
//        5.通过for循环遍历每一个节点
        for(int i=0;i<nodes.getLength();i++){
            //        6.得到每个节点的属性和属性值
            Node animal = nodes.item(i);
            NamedNodeMap attributes = animal.getAttributes();
            for(int j=0;j<attributes.getLength();j++){
                //得到每一个属性
                Node item = attributes.item(j);
                System.out.println("属性名称:"+item.getNodeName()+","+"属性值:"+item.getNodeValue());
            }
            //        7.得到每个节点的子节点属性和属性值
            NodeList childNodes = animal.getChildNodes();
            for(int j=0;j<childNodes.getLength();j++){
                Node item = childNodes.item(j);
                //这里需要注意的是 xml中空白位置也会被当做节点,是空文本输出没有意义
                // 比如</name>与<age>之间的部分也叫节点
                short type = item.getNodeType();
                if (type==Node.ELEMENT_NODE){    // 当节点为元素节点时才输出
                    System.out.println("子节点名:"+item.getNodeName()+",节点值:"+item.getNodeValue());
                }
            }
        }
    }
}

在这里插入图片描述

SAX方式解析Xml数据

  1. 介绍
     SAX,全称 Simple API for XML,是一种以事件驱动的XML API,SAX与DOM不同的是它边扫描边解析,自顶向下一次解析,由于边扫描边解析,所以它解析XML具有速度快,占用内存少的优点。
  2. 解析步骤
     1) 创建SAXParserFactory的对象
     2) 创建SAXParser对象(解析器)
     3) 创建一个DefaultHandler的子类
     4) 调用parse方法
     PS:具体的解析信息可以在自定义的DefaultHandler的子类重写的方法中查看
  3. 示例
     自定义DefaultHandler子类
public class AnimalDefaultHandler extends DefaultHandler {

    //解析xml开始时调用
    @Override
    public void startDocument() throws SAXException {
        System.out.println("开始解析");
    }

    //解析xml结束时调用
    @Override
    public void endDocument() throws SAXException {
        System.out.println("结束解析");
    }

    //解析xml文档中节点开始时调用
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        // 1. 解析animal节点属性值
        if ("animal".equals(qName)){
            //2. 获取该标签的所有属性
            int length = attributes.getLength();
            for(int i=0;i<length;i++){
                String name = attributes.getQName(i);//属性名称
                String value = attributes.getValue(i);//属性值
                System.out.println("属性名称:"+name+",属性值:"+value);
            }
        }else if(!"animal".equals(qName) && !"animals".equals(qName)){ //如果不是animal节点,那么文件中就是子节点了
            System.out.print("子节点名称:"+qName);
        }

    }

    //解析xml文档中节点结束时调用
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
    }

    //获取节点值的方法
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String value = new String(ch, start, length);
        //同样也需要去掉一些空白节点
        if(!"".equals(value.trim())){
            System.out.println("  "+value);
        }
    }
}

public class TestSAX {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//        1)创建SAXParserFactory的对象
        SAXParserFactory factory = SAXParserFactory.newInstance();
//        2)创建SAXParser对象(解析器)
        SAXParser parser = factory.newSAXParser();
//        3)创建一个DefaultHandler的子类
        AnimalDefaultHandler handler = new AnimalDefaultHandler();
//        4)调用parse方法
        parser.parse("src/com/test/Animals.xml",handler);
    }
}

JDOM解析Xml数据

  1. 介绍
     JDOM是一种解析XML的JAVA工具包,它基于树形结构,利用纯JAVA的技术对XML文档实现解析,所以适合于JAVA语言
  2. 解析步骤
     1) 创建一个SAXBuilder对象
     2) 调用build方法,得到Document对象(通过IO流)
     3) 获取根节点
     4) 获取根节点的直接子节点的集合
     5) 遍历集合
  3. 需要导入jar包:jdom.jar 链接:https://pan.baidu.com/s/1-WPT8vHCWUao3-q6gkUgJQ 提取码:or5c
  4. 示例
public class TestJDOM {

    public static void main(String[] args) throws IOException, JDOMException {
//        1)创建一个SAXBuilder对象
        SAXBuilder builder = new SAXBuilder();
//        2)调用build方法,得到Document对象(通过IO流)
        Document document = builder.build(new FileInputStream("src/com/test/Animals.xml"));
//        3)获取根节点
        Element root = document.getRootElement();//Animals节点
//        4)获取根节点的直接子节点的集合
        List<Element> animalList = root.getChildren(); //得到animal的子节点book
//        5)遍历集合
        for(int i=0;i<animalList.size();i++){
            Element animal = animalList.get(i);//拿到一个animal子节点
            // 获取该节点的所有属性 示例中只有一个id属性
            List<Attribute> attributes = animal.getAttributes();
            for(int j=0;j<attributes.size();j++){
                Attribute attr = attributes.get(j);
                System.out.println("属性名称:"+attr.getName()+",属性值:"+attr.getValue());
            }
            //获取每个animal子节点下的子标签
            List<Element> children = animal.getChildren();
            for (Element child : children) {
                System.out.println("子节点名:"+child.getName()+",子节点值:"+ child.getValue());
            }
        }
    }
}

DOM4J解析XML数据(使用最多的)

  1. 介绍
     DOM4J是一个JAVA的XML API,是JDOM的升级品,用来读写XML文件的
  2. 解析步骤
     1) 创建SAXReader对象
     2) 调用read方法
     3) 获取根元素
     4) 通过迭代器遍历直接节点
  3. 需要导入jar包: dom4j.jar 链接:https://pan.baidu.com/s/1-KV4TWm5mFv7nZA0MbVV-Q 提取码:vbdw
  4. 示例----解析Animal.xml,并将得到的数据封装到Animal实体类中
    在这里插入图片描述
public class TestDOM4J {

    public static void main(String[] args) throws DocumentException {
//        1)创建SAXReader对象
        SAXReader saxReader = new SAXReader();
//        2)调用read方法
        Document document = saxReader.read(new File("src/com/test/Animals.xml"));
//        3)获取根元素
        Element rootElement = document.getRootElement();
        //创建保存Animal实体类的集合
        ArrayList<Animal> list = new ArrayList<>();
//        4)通过迭代器遍历animals的直接子节点animal
        for(Iterator<Element> iterator = rootElement.elementIterator();iterator.hasNext();){
            //创建Animal类对象
            Animal a = new Animal();
            Element animal = iterator.next();//取得每个直接子节点animal
            // 获取animal的属性值即示例中的id值
            for(Iterator<Attribute> animalIterator = animal.attributeIterator(); animalIterator.hasNext();){
                Attribute attr = animalIterator.next();
                System.out.println("属性名:"+attr.getName()+",属性值:"+attr.getValue());
            }
            //获取animal的子节点中的名称和值
            for(Iterator<Element> subIterator = animal.elementIterator();subIterator.hasNext();){
                Element element = subIterator.next();
                System.out.println("子节点名称:"+element.getName()+",子节点值:"+element.getText());
                String aname = element.getName();//节点名称 name,age,color
                switch (aname){
                    case "name":
                        a.setName(element.getText());
                        break;
                    case "age":
                        a.setAge(Integer.parseInt(element.getText()));
                        break;
                    case "color":
                        a.setColor(element.getText());
                        break;
                    default:
                            break;
                }
            }
            list.add(a);
        }
        // 遍历保存的Animal集合
        for (Animal animal : list) {
            System.out.println(animal);
        }
    }
}

在这里插入图片描述

四种解析方式总结

  1. DOM解析
     形成了树结构,有助于更好的理解,掌握,且代码容易编写.解析过程中,树结构保存在内存中,方便修改
  2. SAX解析
     采用事件驱动模式,对内存耗费比较小,适用于只处理xml文件中的数据
  3. JDOM解析
     仅使用具体类,而不使用接口,API大量使用了集合类
  4. DOM4J解析
     JDOM的一种智能分支,它合并了许多超出基本xml文档表示的功能,它使用接口和抽象类基本方法,具有性能优异,灵活性好,功能强大和易用的特点,是一个开放源码的文件.

XPATH快速获取节点

  1. 介绍
     Xpath是一种在xml文档汇总快速查找信息的方式,在上述4中方式中,查找节点都是一层一层,或者自顶向下解析,想想如果有很多层结构,那将会非常麻烦,但是使用XPATH就很简单了
  2. 准备jar包: dom4j.jar和Jaxen.jar 链接:https://pan.baidu.com/s/1v60GjwdFZUWx9Nz05RX5uQ 提取码:dq47
  3. 首先放一个XPATH的中文教程文档,打开后选择中文即可,附几张图,非常容易理解
     链接:https://pan.baidu.com/s/1dv8WdCWskm2i45Dmo1HVTg 提取码:3rjm
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. 步骤
     1) 创建SAXReader对象
     2) 读取指定Xml文件
     3) 使用selectSingleNode结合XPATH语法进行获取节点
  5. 示例
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值