XML技术

作用

1.解决程序间数据传输的问题:相当于 json
比如qq之间的数据传送,用xml格式来传送数据,具有良好的可读性,可维护性。

2.xml可以做配置文件
xml文件做配置文件可以说非常的普遍,比如tomcat服务器的server.xml 、web.xml

3.xml可以充当小型的数据库
xml文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用xm来做小型数据库,而且直接读取文件显然要比读取数据库快

<?xml version="1.0" encoding="UTF-8"?>
<!--
	xml是扩展标记语言,标签可以自定义
    1.xml代表文件的类型xml
    2.version="1.0"版本号
    3.encoding="UTF-8"文件编码
    4.students:root元素
    5.<student></student>表示students的子元素,可以有多个
    6.id属性
    7.name、age、gender
-->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender>男</gender>
    </student>
    <student id="200">
        <name>lili</name>
        <age>20</age>
        <gender>女</gender>
    </student>
</students>

文档声明

1.XML声明放在XML文档的第一行
2.version="1.0"版本号
3.encoding="UTF-8"文件编码

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

元素

每个XML文档必须有且只有一个根元素。
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。

如果没有标签体:<group/>,不能空着例如:<group></group>

<students>
    <student id="100">
        <name>jack</name>
        <group/>
        <user_id>0911200314</user_id>
    </student>
</students>

命名规范

1.区分大小写<QY></QY><qy></qy>有区别
2.不能以数字开头
3.不能包含空格
4.名称中间不能有冒号,可以用下划线

属性

1.属性值用单引号或双引号进行分隔
2.一个元素可以有多个属性
3.特定的属性名称在同一个元素标记中只能出现一次
4.属性值不能包括&字符

<!--错误-->
<student id="100" id="101">
<!--可以-->
<student id="100" ID="101">

注释

1.注释不能写在标记里
2.注释不能嵌套
3.注释中不能出现--
4.注释可以写在标记以外任何地方

<!--错误-->
<!--  --  -->

CDADA区、特殊字符

有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用CDATA包括起来,CDATA节中的所有字符都会被当作简单文本,而不是XML标记。

1.语法

<![CDATA[
这里的内容会原样显示不会解析为xml
]]>

2.可以输入任何字符,但是]]>除外
3.不能嵌套

<!--之前报错的可以显示-->
<![CDATA[
        <!-- -- -->
]]>

转义字符

转义符 符号
&lt; <
&gt; >
&amp; &
&quot; "
&apos; '

XML解析技术原理

1.不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析
2.document对象表示的是整个文档(可以是html文档,也可以是xml文档)

DOM4j

文档(dom4j 1.6.1 API)

需要导入的包
下载dom4j
junit-4.13.1.jar
hamcrest-core-1.3.jar

image

1.Dom4j是一一个简单、 灵活的开放源代码的库(用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
2.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一 些, 但它提供了比JDOM更好的灵活性。
3.Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j。
4.使用Dom4j开发,需下载dom4j相应的jar文件

DOM4j中,获取Document对象的三种方式

开发dom4j要导入dom4j的包

1.读取XML文件,获得document对象

SAXReader reader = new SAXReader();	//创建一个解析器
Docunment document = reader.read(new File("src/input.xml"));	//XML Document

2.解析XML形式的文本,得到docunment对象

String text = "<member></members>";
Document document = DocumentHelper.parseText(text);

3.主动创建document对象

Document document = DocumentHelper.createDocument();	//创建根节点
Element root = document.addElement("members");

读取XML信息

image

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="01">
        <name>孙傲天</name>
        <gender>男</gender>
        <age>101</age>
    </student>
    <student id="02">
        <name>李逍遥</name>
        <gender>男</gender>
        <age>1001</age>
    </student>
</students>

别忘了导包

@Test
public void loadXML() throws DocumentException {
    // 得到一个解析器
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/student.xml"));

    // 1.得到根元素
    Element rootElement = document.getRootElement();
    // 2.得到rootElement的student Elements
    List<Element> students = rootElement.elements("student");
    // 长度
    System.out.println(students.size());
    // 遍历
    for (Element student : students) {
        Element name = student.element("name");
        Element age = student.element("age");
        Element gender = student.element("gender");
        // 具体的值得.getText()
        System.out.println("学生信息 = " + name.getText() + ":" + gender.getText() + ":" + age.getText());
    }
}
// 直接获得一个元素
@Test
public void readOne() throws DocumentException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/student.xml"));
    Element rootElement = document.getRootElement();
    // 获取第一个学生
    Element student = (Element) rootElement.elements("student").get(1);
    // 输出
    System.out.println(student.element("name").getText());
    // 获取student元素的属性
    System.out.println(student.attributeValue("id"));
}

添加XML信息

/**
     * 增加元素
     * @throws DocumentException
     * @throws IOException
     */
@Test
public void add() throws DocumentException, IOException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/student.xml"));
    // 创建一个学生节点
    Element newStu = DocumentHelper.createElement("student");
    Element newStu_name = DocumentHelper.createElement("name");
    Element newStu_gender = DocumentHelper.createElement("gender");
    Element newStu_age = DocumentHelper.createElement("age");

    // 添加属性
    newStu.addAttribute("id", "03");
    newStu_name.setText("芊嵛");
    newStu_gender.setText("男");
    newStu_age.setText("18");

    // 把子元素添加到newStu中
    newStu.add(newStu_name);
    newStu.add(newStu_gender);
    newStu.add(newStu_age);

    // 再把newStu节点加到根元素
    document.getRootElement().add(newStu);

    // 直接输出会出现中文乱码
    OutputFormat outputFormat = OutputFormat.createPrettyPrint();
    outputFormat.setEncoding("utf-8");

    //更新xml文件
    XMLWriter writer = new XMLWriter(
        new FileOutputStream(new File("src/student.xml")), outputFormat);
    writer.write(document);
    writer.close();

}

删除XML

/**
     * 删除元素
     * @throws DocumentException
     * @throws IOException
     */
@Test
public void del() throws DocumentException, IOException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/student.xml"));
    // 找到要删除的元素
    Element stu = document.getRootElement().elements("student").get(2);
    // 删除元素
    stu.getParent().remove(stu);
    // 更新XML
    OutputFormat outputFormat = OutputFormat.createPrettyPrint();
    outputFormat.setEncoding("utf-8");

    //更新xml文件
    XMLWriter writer = new XMLWriter(
        new FileOutputStream(new File("src/student.xml")), outputFormat);
    writer.write(document);
    writer.close();
}

更新XML

/**
     * 更新
     * @throws DocumentException
     * @throws IOException
     */
@Test
public void update() throws DocumentException, IOException {
    SAXReader reader = new SAXReader();
    Document document = reader.read(new File("src/student.xml"));
    // 找到要修改的元素
    Element stu = document.getRootElement().elements("student").get(1);
    Element age = stu.element("age");
    age.setText((Integer.parseInt(age.getText())+20)+"");
    // 更新XML
    OutputFormat outputFormat = OutputFormat.createPrettyPrint();
    outputFormat.setEncoding("utf-8");

    //更新xml文件
    XMLWriter writer = new XMLWriter(
        new FileOutputStream(new File("src/student.xml")), outputFormat);
    writer.write(document);
    writer.close();

}