xml文件学习

1.XML

1.XML,extensiblel Markup Language 是可扩展标记语言,是一种标记语言;使用简单的标记来描述数据

2.XML是一种 非常灵活的语言 ,没有 固定 的标签,所有的标签 都可以自定义

3.通常用来信息的 记录传递(就是 文本文件 )因此,xml通常被用于充当配置文件

​ XML不是用来展示数据的,这是他和HTML的区别

XML格式

XMl的编辑器: 记事本 Dreamweaver XMl.Spy

格式良好的XML

1.声明信息:用于描述版本信息和编码方式

2.有且只有一个根元素

3.标签大小写敏感

4.属性值用双引号

5.标签成对

6.元素正确嵌套

注释:

 <!-- 这是XML注释的写法 -->

有效的XML文档

1.格式良好

2.使用dtd和xsd定义语义约束

练习:

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
 <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>

2.DTD

1.简介

1.dtd,Document Type Definition,文档类型定义

2.dtd用于约束xml的文档格式,保证xml是一个有效的xml

3.dtd可以分成两种,内部dtd,外部dtd

2.使用DTD

2.1内部dtd:

就是把dtd写在xml文件中

1.内部DTD的定义
<!DOCTYPE 根元素 [元素声明]>

2.元素声明语法
<!ELEMENT 元素名 (子元素[,子元素...])>

3.数量词
+:表示出现一次或多次,至少一次
?:表示出现0次或1次
*:表示出现任意次 




4.属性声明语法: (属性不止一个,用list)
<!ATTLiST 元素名称 属性名称 属性类型 默认值>
实例: 
<!ATTLIST payment type CDATA "check">

属性类型:CDATA: 表示字符数据(character data)
默认值: #REQUIRED,表示必须出现
		#IMPLIED,表示不是必须的

<!--如果是不必须写的就用#IMPLIED  是必须写的就用#REQUIRED   -->             


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ss [
        <!ELEMENT ss (student*)>
        <!ELEMENT student (name,course,score)>
        <!ATTLIST student id CDATA #REQUIRED>  这个是限制了是一定要写的东西,如果是不必须写的就用#IMPLIED
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT  course (#PCDATA)>
        <!ELEMENT score (#PCDATA)>

 ]>

<ss>
    <student id="01">
        <name>zhangsan</name>
        <course>java</course>
        <score>60</score>
    </student>
    <student id="02">
        <name>lisi</name>
        <course>linux</course>
        <score>65</score>
    </student>

    <student id="03">
        <name>wangwu</name>
        <course>oracle</course>
        <score>95</score>
    </student>
</ss>

<!--   #PCDATA 就是不想让标签中再嵌套标签,就限制他只输入文本内容        -->

一旦写好dtd,那么再写一个元素就会自动补齐,应为已经约定好了要写哪些东西,所以就会自己补齐,

2.2外部dtd:

就是把dtd中的东西用一个dtd文件单独写出来,再在xml文件中引用dtd文件

1.创建一个独立的dtd文件
还是刚刚内部dtd中的东西,但是不要头和尾,只把元素和属性的标签提出来

zzzz1.dtd文件: 
<!ELEMENT ss (student*)>
        <!ELEMENT student (name,course,score)>
        <!ATTLIST student id CDATA #REQUIRED> 
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT  course (#PCDATA)>
        <!ELEMENT score (#PCDATA)>

2.在xml文件中引入上一步写的dtd文件
<!DOCTYPE 根元素  SYSTEM "文件名"> 

zzzz1.xml文件: 
<?xml version="1.0" encoding="UTF-8"?>
<!--引入外部dtd文件   语法:<!DOCTYPE 根元素  SYSTEM "文件名">    -->
<!DOCTYPE ss SYSTEM "zzzz1.dtd">

<ss>
    <student id="01">
        <name>zhangsan</name>
        <course>java</course>
        <score>60</score>
    </student>
    <student id="02">
        <name>lisi</name>
        <course>linux</course>
        <score>65</score>
    </student>

    <student id="03">
        <name>wangwu</name>
        <course>oracle</course>
        <score>95</score>
    </student>
</ss>

上面的两个dtd外部文件 相当于 一个内部dtd文件

3.XMl的解析

对XML文件进行操作,包括创建xml,对xml文件进行 增删改查 操作

3.1常见的xml解析技术

3.1.1 DOM解析

是sun公司 官方提供的解析技术,基于XMl树结构进行解析,比较耗资源,适用于多次访问XML

3.1.2 SAX解析

基于事件的解析,消耗资源小,适用于数据量较大的XML

3.1.3 JDOM解析

第三方提供的

开放原代码

比DOM更快

JDOM仅使用具体类而不使用接口

3.1.4 DOM4J解析

j(就是java,就是JDOM的升级版)

4(英语中for和four同音,就是 for java的意思)

开放原代码

非常优秀的java xml API ,性能优异,功能强大,使用接口而不是实现类

3.2DOM4J解析XML(最常用的是这个)

1.使用DOM4J最多的两件事:

​ (1)从XML中读取信息

​ (2)生成XML文件

3.2.1 从XML中读信息

package DOM4J;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import javax.swing.text.ElementIterator;
import java.io.File;
import java.util.Iterator;

public class xml_read {

    public static void main(String[] args) throws Exception {

        //1.创建SAXReader对象,用于读取XML
        SAXReader reader = new SAXReader();
        //2.读取xml文件,得到Documnent对象
        Document doc = reader.read(new File("src/zzzz1.xml"));//文件的读取就会有异常,要抛异常的
        System.out.println(doc);
        //3.获取根元素(就是从doc对象中取就好)
        Element root = doc.getRootElement();
        System.out.println("根元素名字:" + root.getName());
        //4.获取根元素下的所有子元素(用迭代器(要用泛型的))
        Iterator<?> it = root.elementIterator();//直接用?就可,就是前后咱都不用管是啥类型的
        while(it.hasNext()){//这是迭代器的用法,和while配合着用,有下一个元素就接着循环
            //取出元素
            Element e = (Element) it.next();//拿到的是object类型的,所以要强制转换成Element类型的
            System.out.println(e.getName());
            //获取属性:   属性也有迭代器的e.attributeIterator();
            Attribute id = e.attribute("id" );
            System.out.println(id.getName() + "=" + id.getValue());
            //获取student的子元素
            Element name = e.element("name");
            Element course = e.element("course");
            Element score = e.element("score");

            //打印:
            System.out.println(name.getName()+"="+name.getStringValue());
            System.out.println(course.getName()+"="+course.getText());
            System.out.println(score.getName()+"="+score.getText());
            System.out.println("----------------------------------------------------");
        }
    }
}

运行结果:
在这里插入图片描述

这是zzzz1.xml文件:

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

<!--引入外部dtd文件   语法:<!DOCTYPE 根元素  SYSTEM "文件名">    -->

<!DOCTYPE ss SYSTEM "zzzz1.dtd">

<ss>
    <student id="01">
        <name>zhangsan</name>
        <course>java</course>
        <score>60</score>
    </student>
    <student id="02">
        <name>lisi</name>
        <course>linux</course>
        <score>65</score>
    </student>

    <student id="03">
        <name>wangwu</name>
        <course>oracle</course>
        <score>95</score>
    </student>
</ss>


3.2.2 生成XML文件

package DOM4J;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import javax.sql.rowset.spi.XmlWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class xml_write {
    public static void main(String[] args) throws Exception {
        //1.通过DocumentHelper生成一个Document对象
        Document doc =  DocumentHelper.createDocument();
        //2.添加一个根元素
        Element root = doc.addElement("books");
        //3. 为根元素添加子元素
        Element book = root.addElement("book");
        //4.为元素添加属性
        book.addAttribute("id","01");
        //5.为元素添加子元素
        Element name = book.addElement("name");
        Element author = book.addElement("author");
        Element price = book.addElement("price");
        //6.为子元素赋值
        name.addText("hello beautiful world");
        author.addText("hyh");
        price.addText("188");

/*第一种
        //7.将doc输出到xml文件中
        Writer writer = new FileWriter(new File("src/book_dom4j_writer.xml"));
        doc.write(writer);//writer要一个writer输出流,要吧生成的文件在什么位置指出来
        //8.关闭资源
        writer.close();

*/


//第二种:
        //7.想要输出的好看一点
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter xmlWriter = new XMLWriter(new FileWriter("src/book_dom4j_writer.xml"), format);
        xmlWriter.write(doc);
        //8.关闭资源
        xmlWriter.close();
    }
}


第一种 生成的XML文件:((太丑了吧)已经注释)
在这里插入图片描述
第二种 生成的XML文件: (这次的还好,嘿嘿)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值