XML 和 DTD

1.XML

1.1xml简介

a)xml,eXtensible Markup Language,可扩展标记语言,是一种标记语言;

b)xml是一种非常灵活的语言,没有固定的标签,所有的额标签都可以自定义。

c)通常,xml被用于信息的记录和传递,因此,xml经常被用于充当配置文件。

1.2格式良好的xml

a)声明信息,用于描述xml的版本的编码格式

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

b)xml有且仅有一个根元素

c)xml是大小写敏感的

d)标签是成对的,而且要正确嵌套

e)属性值要使用双引号;例如:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里是注释 -->
<books>
    <book id="b01">
        <name>java高级编程</name>
        <author>张三</author>
        <price>50.5</price>
    </book>
    <book id="b02">
         <name>java中级编程</name>
         <author>李四</author>
         <price>30.5</price>
    </book>
</books>

2.DTD

2.1DTD简介

a)DTD,Document Type Definition,文档类型定义

b)DTD用于约束xml的文档格式,保证xml是一个有效的xml;

c)DTD可以分为两种,内部DTD,外部DTD

2.2使用DTD

2.2.1内部DTD的定义

a)语法如下:

<!DOCTYPE 根元素 [元素声明]>

b)元素声明语法:

<!ELEMENT 元素名(子元素[,子元素...])>

c)数量词

>+:表示出现一次或多次,至少一次

>?:表示出现0次或1次;

>*:表示出现任意次

d)属性声明语法:

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

>默认值:

   - #REQUIRED,表示必须出现

   -#IMPLIED,表示不是必须的

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

e)带DTD的完整xml代码:

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

2.2.2外部DTD的定义

a)创建一个独立的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)>

b)在xml中引入外部DTD文件

<!--引入外部DTD文件>

<!DOCTYPE scores SYSTEM "scores.dtd">

3.XML的解析技术

3.1.1 DOM解析

是官方提供的解析方式基于xml树解析的

3.1.2 SAX解析

是民间的解析方式基于事件的解析

3.1.3 JDOM解析

第三方提供开源免费的解析方式DOM解析快

3.1.4 DOM4J

第三方提供开源免费JDOM的升级版

3.2 DOM4J解析XML

需要导入dom4jjar包, 解析xml的入口, 是需要先拿到一个Document对象

3.2.1 读取xml文件中的信息

需要导入dom4jjar包, 解析xml的入口, 是需要先拿到一个Document对象

    public static void main(String[] args) throws DocumentException {
        //1.创建SAXReader对象,用于读取xml文件
        SAXReader reader = new SAXReader();
        //2.读取xml文件,得到Document对象
        Document doc = reader.read(new File("src/scores2.xml"));
        //3.获取根元素
        Element root = doc.getRootElement();
        //4.获取根元素下所有子元素
        Iterator<Element> iter = root.elementIterator();
        while(iter.hasNext()) {
            //取出元素
            Element e = iter.next();
            System.out.println(e.getName());
            //获取id属性
            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());
            
        }
    }
}

3.2.2 生成xml文件

public class TestXml2 {

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元素添加属性

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("小伟");

price.addText("88");

// [7] 格式良好的输出

OutputFormat format = OutputFormat.createPrettyPrint();

XMLWriter writer = new XMLWriter(new FileWriter(new File("src/book2.xml")), format);

writer.write(doc);

// [8] 关闭资源

writer.close();

}

}

猜你喜欢

转载自www.cnblogs.com/bjsxt123/p/8992647.html