XML的全称是eXtensible Markup Language,即“可扩展标记语言”。XML文件的作用主要是数据存储,文件配置,数据传输。

  html与xml的区别是:①html语法松散,xml语法严格;②html做页面展示,xml做数据存储;③html的所有标签都是预定义的,xml所有标签都是自定义的。xml文档中必须有且只能有一个根元素;元素需要正确闭合;元素需要正确嵌套;元素名称要遵守两点,一是元素名称区分大小写,二是数字不能开头;属性值必须用引号引起来,单双引号都行;xml文档中的注释符为<!--   -->;xml文档中对于可能引起歧义的文本要使用转义字符,或者用<![CDATA[数据内容]],这样的话,数据内容可以原样显示。

<?xml version="1.0" encoding="UTF-8" ?>
<自定义标签>
...
</自定义标签>

  xml的书写规则,有DTD和schema。

  文档类型定义(DTD)可以定义合法的XML文档构建模块,约束自定义的语法规则。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

  内部的 DOCTYPE 声明:

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

  带有 DTD 的 XML 文档实例:

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

  以上 DTD 解释如下:
  !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
  !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
  !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
  !ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
  !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
  !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

  假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

  这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

  这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

  通过 DTD,我们的每一个 XML 文件均可携带一个有关其自身格式的描述。通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。我们的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。我们还可以使用 DTD 来验证自身的数据。

  XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。它是基于 XML 的 DTD 替代者。XML Schema 描述 XML 文档的结构。XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。

  XML Schema 最重要的能力之一就是对数据类型的支持。例:

user.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="http://www.itszt2.com"
xmlns="http://www.itszt2.com">
<xs:element name="用户" type="type_user"></xs:element>
<!-- 复合类型;元素嵌套;自定义数据类型 -->
<xs:complexType name="type_user">
<!-- 规定显示的先后顺序 -->
<xs:sequence>
<xs:element name="姓名" type="type_xm"></xs:element>
<xs:element name="年龄" type="type_nl"></xs:element>
<xs:element name="性别" type="type_xb" minOccurs="1"
maxOccurs="999999999"></xs:element>
<xs:element name="工资" type="type_gz">
</xs:element>
<xs:element name="出生日期" type="xs:date"></xs:element>
</xs:sequence>
</xs:complexType> <!-- 定义姓名的类型 -->
<xs:simpleType name="type_xm">
<xs:restriction base="xs:string">
<xs:pattern value="\w{6,10}" />
</xs:restriction>
</xs:simpleType> <!-- 定义年龄的类型 -->
<xs:simpleType name="type_nl">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"></xs:minInclusive>
<xs:maxInclusive value="100"></xs:maxInclusive>
</xs:restriction>
</xs:simpleType> <!-- 定义性别类型 -->
<xs:simpleType name="type_xb">
<xs:restriction base="xs:string">
<xs:enumeration value="男" />
</xs:restriction>
</xs:simpleType> <!-- 定义属性 -->
<xs:complexType name="type_gz">
<xs:attribute name="单位" type="xs:string" use="required" />
<xs:attribute name="num" type="xs:decimal" />
</xs:complexType>
</xs:schema> -------------------------------------------------------------
test.xml <?xml version="1.0"?>
<用户 xmlns="http://www.itszt2.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.itszt2.com
user.xsd"> <姓名>hehe123</姓名>
<年龄>20</年龄>
<性别>男</性别>
<工资 单位="元" num="123.45" ></工资>
<出生日期>1999-10-10</出生日期> </用户>

  上述演示中,xmlns="http://www.w3school.com.cn"  规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。

  定义简易元素的语法:

<xs:element name="xxx" type="yyy"/>

  上面的 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。  

最常用的类型是:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time

  简易元素可拥有指定的默认值或固定值。当没有其他的值被规定时,默认值就会自动分配给元素。在下面的例子中,缺省值是 "red":

<xs:element name="color" type="xs:string" default="red"/>

  固定值同样会自动分配给元素,并且我们无法规定另外一个值。在下面的例子中,固定值是 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

  简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

  定义属性的语法是:  

<xs:attribute name="xxx" type="yyy"/>

  在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型,与上面定义元素的类型相同。

  限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。

  复合元素指包含其他元素及/或属性的 XML 元素。

有四种类型的复合元素:
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
注释:上述元素均可包含属性!   

  比如,导入xsd约束文档:

(1)编写根标签
(2)引入实例名称空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
(3)引入名称空间 xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
(4)引入默认的名称空间

  在Java技术中,对xml文件的操作也是一个重要的部分。一般来说,xml的格式比较标准,在存储数据方面有着广泛的运用,例如,很多软件(如tomcat,nginx,redis等),包括框架(如Spring,mybatis等)中的一系列配置文件,就广泛地采用了xml来储存配置信息。接下来,我们看如何使用dom4j来对xml文件中的元素进行增删改查。

  在使用dom4j技术时,我们需要在项目中引入dom4j-1.6.1.jar和jaxen-1.1-beta-6.jar两个jar包,并设置为依赖,这样的话,我们就可以使用这两个jar包中的API了。当然,也可以导入dom4j的其他版本,请根据需要而定。

  我们先来看读取一个xml文件,并打印到控制台上:  

 import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.IOException;
/**
* 读取一个xml文件,并将其内容打印到控制台上
*/
public class Test1 {
public static void main(String[] args) {
String filePath = "book.xml";
Document document = readXMLFile(filePath);
printToControl(document);
}
private static void printToControl(Document document) {//打印到控制台
try {
XMLWriter writer = new XMLWriter();
writer.write(document);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static Document readXMLFile(String filePath) {//读取一个xml文件
SAXReader saxReader = new SAXReader();
File file = new File(filePath);
try {
return saxReader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
}

  执行上述代码,读取到名称为book.xml的文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<图书信息 desc="书籍信息">
<图书>
<书名>《战争与和平》</书名>
<作者>列夫·托尔斯泰</作者>
<内容>描述了拿破仑争霸时期,以俄国为社会背景的爱恨情仇</内容>
</图书>
<图书>
<书名>《红楼梦》</书名>
<作者>曹雪芹</作者>
<内容>以贾王史薛四大家族为背景,描述了贾宝玉与林黛玉的感人爱情故事</内容>
</图书>
</图书信息>

  我们还可以把读取到的xml文件储存到一个文件里,在此,我们在上述的Test1类里增加一个储存xml文件的方法,代码如下:

//保存xml文件到指定路径
static boolean saveDocument(Document document,String filePath){
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("UTF-8");
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileWriter(filePath), outputFormat);
writer.write(document);
writer.flush();
writer.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}

  上述代码执行成功后,会在项目下创建一个名称为book2.xml的文件,并返回为true。

  另外,我们还可以创建一个xml文件,这个方法返回一个Document对象,代码如下:

//创建一个xml文件
public static Document createXMLDoc() {
Document document = DocumentHelper.createDocument();
Element root = DocumentHelper.createElement("图书信息");
document.setRootElement(root);
root.addAttribute("desc","书籍信息"); Element book1 = root.addElement("图书");
Element book1_name = book1.addElement("书名");
book1_name.addText("《战争与和平》");
Element book1_author = book1.addElement("作者");
book1_author.addText("列夫·托尔斯泰");
Element book1_content = book1.addElement("内容");
book1_content.addText("描述了拿破仑争霸时期,以俄国为社会背景的爱恨情仇"); Element book2 = root.addElement("图书");
Element book2_name = book2.addElement("书名");
book2_name.addText("《红楼梦》");
Element book2_author = book2.addElement("作者");
book2_author.addText("曹雪芹");
Element book2_content = book2.addElement("内容");
book2_content.addText("以贾王史薛四大家族为背景,描述了贾宝玉与林黛玉的感人爱情故事");
return document;
}

  我们还可以获取父元素下指定名称的第一个节点,代码如下:

//获取父元素下的指定名称第一个节点
static Element getFirstChildNodeByName(Element root,String nodeName){
return (Element)root.selectSingleNode(nodeName);
}

  我们还可以父元素下指定名称的所有节点信息,代码如下:

//获取父元素下的指定名称的所有节点
static List<Element> getAllChildNodeByName(Element root, String nodeName){
return root.selectNodes(nodeName);
}

  我们再来看删除指定节点的属性,代码如下:

//删除指定节点的属性
static void removeAttr(Element root,String nodeName,String attrName){
Element node = root.element(nodeName);
Attribute attr = node.attribute(attrName);
node.remove(attr);
}

  更改指定节点的属性值,代码如下:

//更改指定节点的属性值
static void updateAttrVal(Element root,String nodeName,String attrName,String newValue){
Element node = root.element(nodeName);
Attribute attr = node.attribute(attrName);
attr.setValue(newValue);
}

  为指定节点添加属性值,代码如下:

//为指定节点添加属性
static void addAttr(Element node, String attrKey, String attrValue) {
node.addAttribute(attrKey, attrValue);
}

  对指定节点添加子节点及其文本内容,代码如下:

//对指定节点添加子节点及其文本内容
static Element addNode(Element parentNode,String childNode){
Element element = parentNode.addElement(childNode);
element.setText("haha");
return element;
}

用dom4j操作xml文件的更多相关文章

  1. Dom4j操作XML文件

    1. 创建并写入XML public static void writeXML(String filename){ try { Document document = DocumentHelper.c ...

  2. 使用dom4j对xml文件进行增删改查

    1.使用dom4j技术对dom_demo.xml进行增删改查 首选要下载dom4j的jar包 在官网上找不到,网上搜索了一下在这个链接:http://sourceforge.net/projects/ ...

  3. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  4. Java操作XML文件 dom4j 篇

    在项目中,我们很多都用到了xml文件,无论是参数配置还是与其它系统的数据交互.今天就来讲一下Java 中使用dom4j来操作XML文件. 我们需要引入的包: //文件包 import java.io. ...

  5. Java使用DOM4J对XML文件进行增删改查操作

    Java进行XML文件操作,代码如下: package com.founder.mrp.util; import java.io.File; import java.util.ArrayList; i ...

  6. 用dom4j解析xml文件并执行增删改查操作

    转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...

  7. 【dom4j xml】使用dom4j处理XML文件--测试过程遇到的问题

    首先 关于dom4j的API,有如下: 当然  其中的实体引用有以下: 测试使用环境: 使用Maven搭建web环境,pom.xml文件配置如下: <project xmlns="ht ...

  8. 使用dom4j 读取XML文件

    第一次接触dom4j的时候,感觉这个东西很神秘,因为之前虽然知道XML文件吧,但从来没有用过,一直感觉XML肯定不好操作.当得知,dom4j可以很容易的操作读取XML文件时,不免有些好奇,那么,用do ...

  9. dom4j操作xml文档

    java Dom4j解析XML文件 标签(空格分隔):java进阶 xml文档: <?xml version="1.0" encoding="UTF-8" ...

随机推荐

  1. DjangoORM创建表结构以及生成数据库结构

    1. ORM的两种 DB first: 创建表结构--根据表结构生成类-----根据类来操作数据库 Code first: 先写代码------再写类----执行命令(一个类生成一个表)当前主流的用法 ...

  2. 创建Django工程-Day19

    1. 新建一个day19的工程和app01. 2. 新建templates和static的文件夹. 3. 去settings.py中去做配置. 1)注释掉csrf 2)配置模板路径 'DIRS': [ ...

  3. KMP算法复习【+继续学习】

    离NOIP还剩12天,本蒟蒻开始准备复习了. 先来个KMP[似乎我并没有写过KMP的blog] KMP KMP算法是解决字符串匹配问题的一个算法,主要是单对单的字符串匹配加速,时间复杂度O(m + n ...

  4. 洛谷 3201 [HNOI2009]梦幻布丁 解题报告

    3201 [HNOI2009]梦幻布丁 题目描述 \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2 ...

  5. bzoj2314: 士兵的放置(树形DP)

    0表示被父亲控制,1表示被儿子控制,2表示被自己控制.f表示最少士兵数,g表示方案数. 转移贼难写,写了好久之后写不下去了,看了一眼题解,学习了...原来还可以这么搞 比如求f[i][1]的时候,要在 ...

  6. oracle-DECODE()函数

    DECODE()函数 DECODE(value, if1, then1, if2,then2, if3,then3, . . . else ) 含义解释: DECODE(条件,值1,翻译值1,值2,翻 ...

  7. Codeforces 894.D Ralph And His Tour in Binary Country

    D. Ralph And His Tour in Binary Country time limit per test 2.5 seconds memory limit per test 512 me ...

  8. crontab 自动执行脚本

    crontab -e ================>自动执行某脚本!!!!!!! 1001 ls 1002 cd /home/wwwroot/default/ 1003 ls 1004 cr ...

  9. zabbix 监控 Esxi

    一.下载模板 http://www.zabbix.org/wiki/Zabbix_Templates 我这边ESXI 版本是6.0的,但是模板只有5,也可以用 二.添加模板 配置 ---> 模板 ...

  10. Ibatis的resultMap和查询数据的对应关系

    iBatis和MyBatis 中返回数据对应关系 直接进入主题,现在的项目改用MyBatis了,感觉跟iBatis还是不一样的,比如在判断空值上面,iBatis是有标签的<isNotEmpty& ...