XML笔记

XML概念:

XML 是指可扩展标记语言,类似于HTML,设计的宗旨是传输数据。

XML 技术是W3C(World Wide Web Consorttium)组织发布的,目前遵循的是W3C组织在2000年发布的XML1.规范。

XML 常见应用

1 保存有关系的数据

2 软件的配置文件


3 Struts2 Spring Hibernate都是使用XML作为配置文件

XML语法

  • 文档声明

    <?xml version=“1.0” standalone=“yes” encoding=“UTF-8”?>
    
    xml版本 是否独立(是否依赖其他文档) 编码方式
    
  • 元素

     有且仅有一个根标签
     包含标签主体 <city>北京</city>
     不包含标签主体 <city id="1"/>
     区分大小写 <P>和<p>是两个不同的标记。
     不能以数字或“-” (中划线)开头
     不能以xml(或XML、或Xml 等)开头。
     不能包含空格。
     名称中间不能包含冒号(:)
    
  • 属性

    <city name="北京" citydes="北京是帝都"></city>
    
  • 注释

    <!--这是注释-->
    
  • 特殊字符 –转义

    &   &amp;
    <   &lt;
    >   &gt;
    "   &quot;
    '   &apos;
    
  • CDATA区

    作用:使用CDATA区中间的内容解析成文本内容(字符串)。
    
    语法: <![CDATA[内容]]>
    

XML规则总结

所有 XML 元素都须有关闭标签</>
XML 标签对大小写敏感
XML 必须正确地嵌套顺序
XML 文档必须有根元素(只有一个)
XML 的属性值须加引号  "" 
特殊字符必须转义 --- CDATA
XML 中的空格、回车换行会解析时被保留

XML解析

  • Dom解析

    加载XML的文件,形成树状结构。
    
    优点:树状结构,非常方便做增删改的操作。
    缺点: 必须先加载xml的文档,全部加载,如果文档过大的话,容易导致OOM Out of Memory(内存溢出)。
    
  • SAX解析

    基于事件驱动的解析方式,边读边解析
    
    优点:边读边解析,不会产生内存溢出的问题
    
    缺点:不能够做增删改的操作。
    
  • Dom4J

  • 解析 XML

    public static void readXml() {
        //定义SAX阅读器
        SAXReader saxReader = new SAXReader();
        try {
            //读取要解析的文件
            Document document = saxReader.read("data.xml");
            //获取根节点
            Element rootElement = document.getRootElement();
            //获取要解析的节点
            List<Element> elements = rootElement.elements("person");
            //开始进行解析
            for (Element element : elements) {
                //获取属性值
                String id = element.attribute("id").getText();
                String name = element.element("name").getText();
                String age = element.element("age").getText();
                System.out.println(id + "---" + name + "==" + age);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    
    }
    
    
        /**
     * 添加节点
     */
    private static void addXml() {
        //定义解析器
        SAXReader saxReader = new SAXReader();
        try {
            //读取xml文件
            Document document = saxReader.read("data.xml");
            //获取根节点信息
            Element rootElement = document.getRootElement();
            //获取根节点中的子节点
            List<Element> elements = rootElement.elements("person");
            //遍历节点,获取sex节点,修改sex节点的内容信息
            for (Element element : elements) {
                Element addElement = element.addElement("sex");
                addElement.setText("mail");
            }
            //设置回写的格式为漂亮格式
            OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint();
            //回写,将会修改到xml的内容
            XMLWriter xmlWriter = new XMLWriter(
                    new FileOutputStream("data.xml"), createPrettyPrint);
    
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    }
    
    
        /**
     * 删除节点
     */
    private static void deleteXmlNode() {
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("data.xml");
            Element rootElement = document.getRootElement();
            List<Element> elements = rootElement.elements("person");
            for (Element element : elements) {
                Element element2 = element.element("name");
                //通过父节点,移除子节点
                element.remove(element2);
            }
            OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint();
    
            XMLWriter xmlWriter = new XMLWriter(
                    new FileOutputStream("data.xml"), createPrettyPrint);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
        /**
     * 修改节点信息
     */
    private static void updateXmlNode() {
        // TODO Auto-generated method stub
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read("data.xml");
            Element rootElement = document.getRootElement();
            List<Element> elements = rootElement.elements("person");
            for (Element element : elements) {
                Element element2 = element.element("age");
                element2.setName("ddd");
            }
            OutputFormat createPrettyPrint = OutputFormat.createPrettyPrint();
    
            XMLWriter xmlWriter = new XMLWriter(
                    new FileOutputStream("data.xml"), createPrettyPrint);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
  • 创建xml文档

    try {
        // 创建xml文档
        Document document = DocumentHelper.createDocument();
        // 创建根节点
        Element rootElement = document.addElement("users");
        for (User user : userList) {
            // 每一个用户创建一个user节点
            Element userElement = rootElement.addElement("user");
            Element nameElement = userElement.addElement("name");
            Element sexElement = userElement.addElement("sex");
            Element departElement = userElement
                    .addElement("department_name");
            nameElement.setText(user.getName());
            sexElement.setText(user.getSex());
            departElement.setText(user.getDepartment_name());
        }
        // 输出文档
        // 获取当前时间的毫秒值 1970 + System.currentTimeMillis()
    
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File(
                "user.xml")), OutputFormat.createPrettyPrint());
    
        xmlWriter.write(document);
        xmlWriter.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
  • 对象XPATH XML快速查找

    /persons/person/name
    
    //name
    
    
        @Test
    public void xPath() {
        // 创建解析器对象
        try {
            SAXReader reader = new SAXReader();
            //读取文件
            Document document = reader.read(new File("data.xml"));
            //根据节点顺序查询子节点
            List<Node> nodes = document.selectNodes("/persons/person/name");
            for (Node node : nodes) {
                System.out.println(node.getText());
            }
    
            //直接查询某个节点
            List<Element> elements = document.selectNodes("//age");
            for (Element element : elements) {
                System.out.println(element.getText());
            }
    
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
    

约束

  • 为什么要约束:

    XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
    
    XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。     
    
  • 常用的约束技术

    XML DTD 
    XML Schema
    
  • DTD 约束

    Struts2 --dtd 关联dtd
    
    (Document Type Definition),全称为文档类型定义。
    
    DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写
    使用内部DTD
    <!DOCTYPE  根节点  [   DTD的代码  ]>
    使用外部DTD
    <!DOCTYPE  根节点  SYSTEM  “DTD的地址”   >
    使用网络DTD
    <!DOCTYPE  根节点   PUBLIC   “DTD的名称”  “DTD的地址” >
    
    
    语法结构
    

元素定义

* 写法:<!ELEMENT 元素名称 元素类型>

* 元素类型:

    * (#PCDATA)                 可解析的字符数据(字符串)

    * EMPTY                     空(没有标签主体)

    * ANY                       任意类型

    * (子节点1,子节点2...)        当前的元素是复杂的元素,下面包含子节点



* 子节点之间关系

    * 子节点与子节点出现顺序的关系

        * ,     :代表子节点按着顺序出现

        * |     :子节点出现只能出现一个

    * 子节点出现的数量的关系

        * +     :子节点可以出现1次或多次

        * *     :子节点可以出现0次或多次(任意次)

        * ?     :子节点可以出现0次或1次

属性定义

* 写法:

    <!ATTLIST 元素名称 

        属性名称 属性类型 属性约束 

        属性名称 属性类型 属性约束

    >

* 属性类型

    * CDATA     字符数据(字符串)

    * 枚举:没有关键字,写法(值1|值2|值3),只能从枚举中选择其中一个值

    * ID:代表是属性是唯一的,值就不能相同了。值也不能是数字



* 属性约束

    * #REQUIRED     属性是必须要出现的

    * #IMPLIED      属性的出现是可选的

    * #FIXED        固定值 -- #FIXED "固定值"

    * 默认值           提供默认值   ""
  • Schema约束

    XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性
    
    XML Schema符合XML语法结构。 
    
    DOM、SAX等XML API很容易解析出XML Schema文档中的内容。 
    
    XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
    
    XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值