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. Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程

    陈巧然 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验步骤 登陆实验楼虚 ...

  2. 【noip2018】【luogu5021】赛道修建

    题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...

  3. Jenkins+SVN+Maven发布项目

    一.安装jenkins插件 登入Jenkis后,安装几个插件: Maven Integration plugin # 没有这个插件,不能创建maven项目 Subversion Plug-in Pub ...

  4. 「Python-Django」Django中使用数据库的 9 个小技巧

    Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...

  5. windows如何要查看IIS连接数

    1.运行,输入,perfmon.msc 2.在系统监视器,区域点击,添加计数器. 3.在“添加计数器”窗口,“性能对象”选择Web Service,“从列表选择计数器”选中Current Connec ...

  6. Vue 插槽详解

    Vue插槽,是学习vue中必不可少的一节,当初刚接触vue的时候,对这些掌握的一知半解,特别是作用域插槽一直没明白. 后面越来越发现插槽的好用. 分享一下插槽的一些知识吧. 分一下几点: 1.插槽内可 ...

  7. 优先队列 逆向思维 Gym 101128C

    题目链接:http://codeforces.com/gym/101128/my 具体题目大意可以看这个人的:http://blog.csdn.net/v5zsq/article/details/61 ...

  8. spfa+剪枝 或者 dij+手写堆+剪枝 UOJ 111

    http://uoj.ac/problem/111 好像NOIP里面的题目...有好多都是...能通过xjbg剪枝来...AC题目的? 得好好学一下这些剪枝黑科技了... 思路:我觉得这位大佬说的很完 ...

  9. HDU6129 规律

    LINK 题意:n个数进行m次前缀和异或和后的情况,其中$n,m(1\leq n\leq2\times10^5,1\leq m\leq10^9)$. 思路:看到m这么大,肯定要分解m的,又是异或和,二 ...

  10. Packet Tracer 5.0 构建CCNA实验(3)—— 路由器实现vlan间通信

    --交换机配置 --交换机和路由器连接的接口 switchport mode trunk --路由器配置 enable conf t int fa0/0.1 --路由器接口的子接口 encapsula ...