天天看点

JavaWeb基础day01_XML

一、XML

XML文件的默认打开方式是浏览器

xml:是可扩展的标记语言 Extensible Markup Language。以一种标签语言与HTML类似

1、xml的作用

  1. 编写配置文件:C3P0编写XML配置文件
  2. 做数据传输

2、有效的XML文档

  1. 必须是格式良好的XML文档
  2. 使用DTD和XSD(XML Schema)定义语义约束

2.1、格式良好的XML

  • 声明信息,用于描述XML的版本和编码方式
<?xml version="1.0" encoding="UTF-8"?>      
  • XML要有且仅有一个根元素。一个元素是一对标签,标签里面是内容
<books><!-- 根标签 -->
  <books_name 属性=“属性值”><!-- 子元素 -->
    <!-- 这里是写注释 -->
  </books_name>
</books>      
  • XML是大小写敏感的
  • XML是标签成对的,而且要正确嵌套
  • 属性值要使用双引号。
  • 注释的写法
<!-- 这里写注释 -->      

【案例1】:描述一下学生的信息

<?xml version="1.0" encoding="UTF-8"?>
<Students>
  <student id="1">
    <name>王彤</name>
    <course>Java</course>
    <score>89</score>
  </student>
  <student id="2">
    <name>李佳</name>
    <course>sql</course>
    <score>58</score>
  </student>
</Students>      

二、DTD

1、DTD简介

DTD:文档类型定义 Document Type Definition

2、DTD作用

  • 约束XML文档格式,保证XML是一个有效的XML文档

3、DTD用法

DTD在使用的时候可以分为两种
  1. 内部DTD
  2. 外部DTD

3.1 内部DTD

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>      
【元素声明语法】
<!ELEMENT 元素名(子元素[,子元素……])>      

【数量词】 限制元素出现的次数

数量词 含义
+ 表示出现​

​一次或者多次​

​出现零次或一次​

* 出现零次或多次,​

​即任意次​

【属性声明语法】

属性声明使用下列语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>      

【属性类型】:CDATA,表示字符数据(character data)

【默认值】:

  • #REQUIRED:必须出现
  • #IMPLIED:不是必须的
<!ATTLIST student id CDATA "0">
<!ATTLIST student id CDATA #REQUIRED>
<!ATTLIST student id CDATA #IMPLIED>      
【格式良好的DTD约束的XML文档】

【案例1】:描述一下学生的信息使用DTD约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 声明内部DTD --> <!-- 中括号内写元素声明 -->
<!DOCTYPE scores [<!ELEMENT scores (student*) >
  <!ELEMENT student (name, course, score)>
  <!ATTLIST student id CDATA #REQUIRED>
  
  <!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
  <!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
  <!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->]>
<scores>
  <student id="1">
    <name>王彤</name>
    <course>Java</course>
    <score>89</score>
  </student>
  <student id="2">
    <name>李佳</name>
    <course>sql</course>
    <score>58</score>
  </student>
  <student id="3">
    <name>张三</name>
    <course>html</course>
    <score>88</score>
  </student>
</scores>      

3.2 外部DTD

创建一个独立的DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student*) >
<!ELEMENT student (name, course, score)>
<!ATTLIST student id CDATA #REQUIRED>
  
<!ELEMENT name (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT course (#PCDATA)> <!-- 表示只允许标签里写内容 -->
<!ELEMENT score (#PCDATA)> <!-- 表示只允许标签里写内容 -->      
在XML文件中引入DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入外部DTD --> 
<!DOCTYPE scores SYSTEM "Student.dtd">
<scores>
  <student id="1">
    <name>王彤</name>
    <course>Java</course>
    <score>89</score>
  </student>
  <student id="2">
    <name>李佳</name>
    <course>sql</course>
    <score>58</score>
  </student>
</scores>      

三、约束和验证XML

1、XSD

  • XSD
  • XML Schema是DTD的替代者
  • 不仅可以定义XML文档的结构, 还可以规范文档的内容
  • XSD本身也是XML文档,
  • XSD采用XML文档来定义语义约束,比DTD要复杂一-些,但是功能强大的多。
  • 支持丰富的数据类型
  • 允许开发者自定义数据类型
  • 可读性强
  • 可针对未来需求进行扩展

2、XML解析技术

对XML文件的操作,包括创建XML,对XML文件的增删改查操作

2.1常见的XML解析技术有哪些?

2.1.1 DOM解析

基于XML树结构,耗费资源。是官方提供的解析方式

2.1.2 SAX解析

是民间的解析方式,SAX是基于事件的解析方式,消耗的资源少。数据量大的时候适用

以上两种都是原生的解析方式,代码量巨大

2.1.3 JDOM解析

第三方提供的解析,开源,免费的解析方式,效率比DOM解析快

2.1.4 DOM4J接口**

2.2 使用DOM4J解析XML

2.2.1读取XML文档中的信息

  1. 导包:dom4j.jar
  2. 编写代码测试【如下】
public class Test {
  public static void main(String[] args) {
    //[1]创建SAX对象,用于读取XML文件
    SAXReader reader = new SAXReader();
    Document doc = null;
    try {
      // [2]读取xml文件,找到Document对象
      doc = reader.read(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"xml"+File.separator+"Student2.xml"));
      //[3]获取根元素 getRootElement
      Element root = doc.getRootElement();
      //System.out.println("根元素:"+root.getName());
            
      //[4 iterator]迭代器迭代更元素下的所有元素
      Iterator<Element> it = root.elementIterator();
      while (it.hasNext()) {
        Element element = (Element) it.next();
        //System.out.println(element.getName());
                
        //[5]取属性  Iterator attributes = element.attributeIterator(); 多个属性迭代继续
        Attribute id = element.attribute("id");
        //System.out.println(id.getName()+"="+id.getValue());
                
        //[6]获取子元素
        /*Iterator<Element> elements = element.elementIterator();
        while (elements.hasNext()) {
          Element element2 = (Element) elements.next();
          System.out.println(element2.getName());
        }*/
                //[7]打印输出
        System.out.println("id="+element.attribute("id").getName()+"-----"+"value="+element.attribute("id").getText());
        System.out.println("name="+element.element("name").getName()+"-----"+"value="+element.element("name").getText());
        System.out.println("score="+element.element("score").getName()+"-----"+"value="+element.element("score").getText());
        System.out.println("course="+element.element("course").getName()+"-----"+"value="+element.element("course").getText());
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}      

2.2.2 使用dom4j生成XML文件

public class Test2 {
  public static void main(String[] args) {
    // [1] 通过Documenthelper创建一个documnet对象
    Document doc = DocumentHelper.createDocument();
    // [2] 写一个Xml文件,添加一个根元素,并得到根元素
    Element root = doc.addElement("books");
    // [3] 为根元素添加元素
    Element book = root.addElement("book");
    // [4] 为元素添加属性 方便链式编程
    book.addAttribute("id", "b01");
    // [5] 为book添加在元素
    Element name = book.addElement("name");
    Element author = book.addElement("author");
    Element price = book.addElement("price");
    // [6] 为子元素添加文本信息
    name.addText("Thinking in java");
    author.addText("efcod");
    price.addText("88");
    
    // [7] 将doc输出到XML文件中即可
    Writer writer = null;
    Writer writerFormat = null;
    try {
      writer  = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"book2.xml"));
      writerFormat  = new FileWriter(new File("src"+File.separator+"com"+File.separator+"wei"+File.separator+"dom4j"+File.separator+"bookFormat.xml"));
      doc.write(writer);
      // [8] 格式良好的输出
      OutputFormat format = OutputFormat.createPrettyPrint();
      XMLWriter writer2 = new XMLWriter(writerFormat,format);
      writer2.write(doc);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }finally {
      try {
        if (writer!=null) {
          writer.close();
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      try {
        if (writerFormat!=null) {
          writerFormat.close();
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }    
  }
}