XML

作者: 磊_5d71 | 来源:发表于2018-09-18 21:24 被阅读0次
    • XML的全称是Extensible Markup Language,可扩展标记语言
    • 编写XML就是编写标签,与HTML非常类似,扩展名为.xml
    • 良好的人机可读性,标签都是自定义的。

    XML与HTML的比较

    • XML与HTML非常相似,都是编写标签
    • XML没有预定义标签,HTML存在大量预定义标签
    • XML重在保存与传输数据,HTML用于显示信息
    • 案例 hr.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 人力资源管理系统 -->
    <hr>
        <employee no="3309">
            <name>张三</name>
            <age>31</age>
            <salary>4000</salary>
            <department>
                <dname>会计部</dname>
                <address>隆安大厦-B103</address>
            </department>
        </employee>
        
        <employee no="3310">
            <name>李四</name>
            <age>23</age>
            <salary>3000</salary>
            <department>
                <dname>工程部</dname>
                <address>隆安大厦-B104</address>
            </department>
        </employee>
    </hr>
    

    XML的用途

    • Java程序的配置描述文件(写死在程序中,如果修改麻烦,可以放在XML配置文件中
    • 用户保存程序产生的数据
    • 网络间的数据传输

    XML文档结构

    • 第一行必须是XML声明 主要包括版本号与字符集
    • 有且只有一个根结点
    • XML标签的书写规则与HTML相同

    XML语义约束

    • XML语义约束有两种定义方式:DTD与XML Schema
    DTD定义节点
    • 利用DTD中的<!ELEMENT>标签,可以定义XML文档中允许出现的节点及数量。


      image.png
      image.png
    • 案例 hr.dtd
    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT hr (employee+)>
    <!-- employee后面一定要加空格-->
    <!ELEMENT employee (name,age,salary,department)>
    <!-- employee属性的设置-->
    <!ATTLIST employee no CDATA "">
    <!-- 定义标签里面的内容为纯文本节点-->
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT salary (#PCDATA)>
    <!ELEMENT department (dname,address)>
    <!ELEMENT dname (#PCDATA)>
    <!ELEMENT address (#PCDATA)>
    
    XML Schema
    • XML Schema比DTD更为复杂,提供了更多的功能。
    • 提供了数据类型、格式限定、数据范围等特性。
    • 是W3C的标准规范
    • 框架和架构方面都需要用到Schema的支持
    • 案例 hr.xsd
    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
        <element name="hr">
            <!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
            <complexType>
                <sequence>
                    <element name="employee" minOccurs="1" maxOccurs="9999">
                        <complexType>
                            <sequence>
                                <element name="name" type="string"></element>
                                <element name="age">
                                    <simpleType>
                                        <restriction base="integer">
                                            <minExclusive value="18"></minExclusive>
                                            <maxExclusive value="60"></maxExclusive>
                                        </restriction>
                                    </simpleType>
                                </element>
                                <element name="salary" type="integer"></element>
                                <element name="department">
                                    <complexType>
                                        <sequence>
                                            <element name="dname" type="string"></element>
                                            <element name="address" type="string"></element>
                                        </sequence>
                                    </complexType>
                                </element>
                            </sequence>
                            <attribute name="no" type="string" use="required"></attribute>                  
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>  
    </schema>
    

    DOM文档对象模型

    • DOM(Document Object Model)定义了访问和操作XML文档的标准方法,把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。

    Dom4j java库

    • 4j (for java的谐音)
    • Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极易使用的特点。
    • Dom4j将XML视为Document对象。
    • XML标签被Dom4j定义为Element对象。
    • 案例
    package com.alan.dom4j;
    
    import java.io.File;
    import java.util.List;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class HrReader {
    
        public void readXml() {
            
            File xmlFile = new File("/Users/alan/eclipse-workspace/XmlProj/src/hr.xml");
    
            // SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中
            SAXReader reader = new SAXReader();
            try {
                //将树状结构的XML赋值给Document对象,一个XML对应一个Document对象
                Document document = reader.read(xmlFile);
                //获取XML文档的根结点,即hr标签
                Element root = document.getRootElement();
                //elements方法用于获取指定的标签集合
                List<Element> employeesList = root.elements();
                for(Element employee:employeesList) {
                    //element方法用于获取唯一的子节点对象
                    Element name = employee.element("name");
                    //getText()方法用于获取标签文本内容
                    String empname = name.getText(); 
                    System.out.println(empname);
                    System.out.println(employee.elementText("age"));
                    System.out.println(employee.elementText("salary"));
                    Element department = employee.element("department");
                    System.out.println(department.elementText("dname"));
                    System.out.println(department.elementText("address"));
                    //或缺属性值
                    Attribute atr =  employee.attribute("no");
                    System.out.println(atr.getText());
                }
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            HrReader hr = new HrReader();
            hr.readXml();
        }
    
    }
    

    Dom4j更新XML

    package com.alan.dom4j;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    public class HrWriter {
    
        public void writeXml() {
    
            File xmlFile = new File("/Users/alan/eclipse-workspace/XmlProj/src/hr.xml");
            // SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中
            SAXReader reader = new SAXReader();
            try {
                // 在内存中构建DOM模型
                Document document = reader.read(xmlFile);
                Element root = document.getRootElement();
                Element employee = root.addElement("employee");
                employee.addAttribute("no", "3311");
                Element name = employee.addElement("name");
                name.setText("李铁柱");
                employee.addElement("age").setText("22");
                employee.addElement("salary").setText("3600");
    
                Element department = employee.addElement("department");
                Element dname = department.addElement("dname");
                dname.setText("人事部");
                Element address = department.addElement("address");
                address.setText("隆安大厦-B105");
                // 将内存中的模型写入到xml中
                try {
                    Writer writer = new OutputStreamWriter(new FileOutputStream(xmlFile));
                    document.write(writer);
                    writer.flush();
                    writer.close();
                } catch (FileNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HrWriter hw = new HrWriter();
            hw.writeXml();
        }
    
    }
    

    XPath路径表达式

    • XPath路径表达式是XML文档中查找数据的语音

    • 掌握XPath可以极大的提高在提取数据时的开发效率

    • 学习XPath本质就是掌握各种形式表达式的使用技巧


      image.png
    • Jaxen介绍
      1、Jaxen是一个Java编写的开源的XPath库。这是适应多种不同的对象模型,包括DOM,XOM,dom4j和JDOM。
      2、Dom4j底层依赖Jaxen实现XPath查询
      3、通过maven.aliyun.com 下载jar包

    • 案例

    package com.alan.dom4j;
    
    import java.io.File;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.SAXReader;
    
    
    public class XPathTest {
        
        public void xpath(String xpathExp) {
            
            String file = "/Users/alan/eclipse-workspace/XmlProj/src/hr.xml";
            SAXReader reader = new SAXReader();
            try {
                Document document = reader.read(file);
                List<Node> nodes = document.selectNodes(xpathExp);
                for(Node node:nodes) {
                    Element element = (Element) node;
                    System.out.println(element.attributeValue("no"));
                    System.out.println(element.elementText("name"));
                    System.out.println(element.elementText("age"));
                    System.out.println(element.elementText("salary"));
                    System.out.println("===========================");
    
                }
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    
        public static void main(String[] args) {
            XPathTest xt = new XPathTest();
            //xt.xpath("/hr/employee");
            //xt.xpath("//employee");
            //查询工资小于3500的员工信息
            //xt.xpath("//employee[salary<=3600]");
            //xt.xpath("//employee[name='李铁柱']");
            //xt.xpath("//employee[@no=3309]");
            //xt.xpath("//employee[1]");
            //xt.xpath("//employee[last()]");
            //xt.xpath("//employee[position()<3]");
            xt.xpath("//employee[1] | //employee[3]");
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:XML

          本文链接:https://www.haomeiwen.com/subject/axkunftx.html