XML学记笔记

XML是一种可扩展标记语言(Extensible Markup Language)

用途:1.java程序配置文件。 2.保存程序产生的数据。  3.网络间的数据传输。

结构:

1.第一行必须是XML声明

<?xml version="1.0" encoding="UTF-8"?>

说明版本与字符集方式

2.有且只有一个根节点。

3.书写规则与HTML相同。

补充:

当XML书写出现一些特殊字符有两种解决方法:1.使用实体引用。2.使用CDATA标签。

 例如

<question> 1+1>3是否正确 </question>   //此时>会破坏文档结构

使用实体引用:

<question> 1+1&gt;3是否正确 </question>   

xml中支持五中实体引用:

 

实体引用 对应符号 符号名称  
&lt; < 大于
&gt; > 小于
&amp; &
&apos; ' 单引号
&quot; '' 双引号

使用CDATA标签:指的是不应由XML解析器进行解析的文本数据结构。

方式:

<![CDATA[
  <body>
      XXXX
   </body>
]]>

其中body这一段不需要编译

XML语义约束                                                                                                                                                     语义约束有两种方式:DTDxml schema.

   DTD(Document Type Definition) 文档类型定义  扩展名为.dtd

                          

 利用 DTD中<!ELEMENT>标签,可以定义XML文档中允许出现的节点及数量。

 这是一个XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"><!-- 人力资源管理系统 -->
<hr>
    <employee no="3309">
        <name>张三</name>
        <age>31</age>
        <salary>4000</salary>
        <department>
            <dname>会计部</dname>
            <address>XX大厦-B103</address>
        </department>
    </employee>

    <employee no="3310">
        <name>李四</name>
        <age>23</age>
        <salary>3000</salary>
        <department>
            <dname>工程部</dname>
            <address>xx大厦-B014&lt;</address>
        </department>
    </employee>

<employee no="4410"> <name>王五</name> <age>28</age> <salary>5000</salary> <department> <dname>项目部</dname> <address>xx大厦-B015</address> </department> </employee> </hr>
注意:<!DOCTYPE hr SYSTEM "hr.dtd"> 是引用DTD文件的意思  格式:   <!DOCTYPE 根节点 SYSTEM DTD文件路径>
 

 这是一个DTD文件:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>               //根节点hr 里面的子节点employee,employee+表示最少一个,employee*表示0到n个,employee?最多一个
<!ELEMENT employee (name,age,salary,department)>     //子节点下的四个子节点,并且要按顺序出现
<!ATTLIST employee no CDATA "">        //employee的no属性 使用CDATA标签
<!ELEMENT name (#PCDATA)>               //定义标签只能是文本,#PCDATA代表文本元素
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>   //deparatment的子节点
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>

  XML schema比DTD更为复杂,提供了更多的功能。它可保证xml文件中的数据类型、格式限定、数据范围。xml schema是W3C标准。

 这是一个引用schema的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->

<!--  下面这段话的意思是引用 xsd文件进行约束 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
  <employee no="3309">
     <name>张三</name>
     <age>31</age>
     <salary>4000</salary>
     <department>
        <dname>会计部</dname>
        <address>XX大厦-B103</address>
     </department>
  </employee>

   <employee no="3310">
      <name>李四</name>
      <age>23</age>
      <salary>3000</salary>
      <department>
         <dname>工程部</dname>
         <address>xx大厦-B014&lt;</address>
      </department>
   </employee>
  

</hr>

这是一个xml-schema文件

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" >
 <element name="hr">   //根节点hr
     <!-- complexType标签的含义是复杂节点,包含子节点时必须要使用这个标签 -->
     <complexType>
        <!-- sequence的含义是里面的子节点必须按顺序前后排列 -->
        <sequence>
        <!-- minOccurs表示最少出现一次 maxOccurs表示最多99999次 对数据范围进行了约束 -->
             <element name="employee" minOccurs="1" maxOccurs="99999">   //子节点employee
                 <complexType>
                     <sequence>
                          <element name="name" type="string"></element>  //子节点name和age 
                          <element name="age" >
                              <simpleType>  //简单文本类型
                              <!-- 对数值范围进行了约束,表示数值必须是整数 且在18到65之间 -->
                                 <restriction base="integer">
                                    <minInclusive value="18"></minInclusive>
                                    <maxInclusive value="65"></maxInclusive>
                                 </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>
                            <!--  required表示no必须加 -->
          <attribute name="no" type="string" use="required"></attribute>   //empolyee的属性 no
                 </complexType>
                 </element>
        </sequence>
      </complexType>
 </element>
</schema>

 以上代码需要去除//

DOM文档对象

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

  我们一般使用Dom4j来实现,Dom4j是一个易用的、开源的库,用于解析XML。Dom4j将XML视为 Document对象,XML标签被Dom4j定义为Element对象。需要到DOM4j的官网下载。

  以下是一个引用Dom4j来读取XML文件的对象       

package com.imooc.dom4j;

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() {
//xml文件的url地址 String file
="d:/workplace/imooctest1/WebContent/WEB-INF/hr.xml"; //SAXReader类是读取XML文件的核心类,用于将XML解析后以“树”的形式保存在内存中 SAXReader reader=new SAXReader(); try {
//读取文件 Document document
=reader.read(file); //获取根节点,即hr标签。 Element root=document.getRootElement(); //elements方法用于获取指定的标签集合 List<Element> employees=root.elements("employee");
//遍历employee子节点
for(Element employee :employees) {
//element方法用于获取唯一的子节点对象 Element name=employee.element("name"); String empname=name.getText();//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.element("dname").getText()); System.out.println(department.element("address").getText()); Attribute att=employee.attribute("no"); //获得employee属性no System.out.println(att.getText()); } } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //执行方法 public static void main(String[] args) { HrReader hrreader=new HrReader(); hrreader.readXml(); } }

以下是一个引用Dom4j来操作XML文件的对象

package com.imooc.dom4j;

import java.io.FileOutputStream;
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 XmlWriter() {
        //获取文件位置
        String url="D:/workplace/imooctest1/WebContent/WEB-INF/hr.xml";
        SAXReader reader=new SAXReader();
        
        try {
            //读取XML文件
            Document document=reader.read(url);
            //获取根节点,即hr标签
            Element root=document.getRootElement();
            //获取根节点下的子节点 employee
            Element employee=root.addElement("employee");
            //建立子节点的属性
            employee.addAttribute("no", "4410");
            //获取子节点下的子节点 name
            Element name=employee.addElement("name");
            //建立子节点的文本 王五
            name.addText("王五");
            Element age=employee.addElement("age");
            age.addText("28");
            //同上
            Element salary=employee.addElement("salary");
            salary.addText("5000");
            //同上
            Element department=employee.addElement("department");
            Element dname=department.addElement("dname");
            dname.addText("项目部");
            Element address=department.addElement("address");
            address.addText("xx大厦-B015");
            //将此文内容转换字节流,并输入到hr.xml中。url为xml文件地址,字符集为UTF-8
            Writer writer=new OutputStreamWriter(new FileOutputStream(url),"UTF-8");
            document.write(writer);
            writer.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        HrWriter hrwriter=new HrWriter();
        hrwriter.XmlWriter();
    }
}

     


 

猜你喜欢

转载自www.cnblogs.com/tzs123/p/12026517.html