XML技术说明及应用

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();

}
posted @   芊嵛  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
イエスタデイ(翻自 Official髭男dism) - 茶泡饭,春茶,kobasolo
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 藤原聡

作曲 : 藤原聡

何度失ったって

取り返して見せるよ

雨上がり 虹がかかった空みたいな

君の笑みを

例えばその代償に

誰かの表情を

曇らせてしまったっていい

悪者は僕だけでいい

本当はいつでも

誰もと思いやりあっていたい

でもそんな悠長な理想論は

ここで捨てなくちゃな

遥か先で 君へ 狙いを定めた恐怖を

遥か先で 君へ 狙いを定めた恐怖を

どれだけ僕は

はらい切れるんだろう?

半信半疑で 世間体

半信半疑で 世間体

気にしてばっかのイエスタデイ

ポケットの中で怯えたこの手は

まだ忘れられないまま

「何度傷ついたって

「何度傷ついたって

仕方ないよ」と言って

うつむいて君が溢した

儚くなまぬるい涙

ただの一粒だって

僕を不甲斐なさで 溺れさせて

理性を奪うには十分過ぎた

街のクラクションもサイレンも

街のクラクションもサイレンも

届きやしないほど

遥か先へ進め 身勝手すぎる恋だと

遥か先へ進め 身勝手すぎる恋だと

世界が後ろから指差しても

振り向かず進め必死で

振り向かず進め必死で

君の元へ急ぐよ

道の途中で聞こえたSOS さえ

気づかないふりで

バイバイイエスタデイ ごめんね

バイバイイエスタデイ ごめんね

名残惜しいけど行くよ

いつかの憧れと違う僕でも

ただ1人だけ 君だけ

守るための強さを

何よりも望んでいた この手に今

遥か先へ進め

遥か先へ進め

幼すぎる恋だと

世界が後ろから指差しても

迷わずに進め 進め

2人だけの宇宙へと

ポケットの中で震えたこの手で今

君を連れ出して

未来の僕は知らない

だから視線は止まらない

謎めいた表現技法

意味深な君の気性

アイラブユーさえ

アイラブユーさえ

風に 飛ばされそうな時でも

不器用ながら繋いだ この手はもう

決して離さずに

虹の先へ

点击右上角即可分享
微信分享提示