1.XML有什么用?

(1)可以用来保存数据

(2)可以用来做配置文件

(3)数据传输载体

2.XML格式

XML 元素必须遵循以下命名规则:

名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格

元素分为简单元素与复杂元素:

简单元素:元素里面包含了普通的文字

复杂元素:元素里面还可以嵌套其他的元素

示例:

<?xml version="1.0" encoding="utf-8"?>
<stus>
<stu id="100">
<name>张三</name>
<age>13</age>
</stu>
<stu id="101">
<name>李四</name>
<age>14</age>
</stu>
</stus>

3.CDATA区

如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来包装。

CDATA区段开始于"<![CDATA[",结束于"]]>"。

示例:

 <?xml version="1.0" encoding="utf-8"?>
<stus>
<stu id="100">
<name>张三</name>
<age>13</age>
<search><![CDATA[<a href="http://www.baidu.com">百度</a>]]></search>
</stu>
<stu id="101">
<name>李四</name>
<age>14</age>
</stu>
</stus>

4.JAVA解析XML

解析,就是把xml里面的文本数据提取出来。

XML解析有很多种方式,比较常用的有两种,分别是DOM和SAX。

两者的区别如下:

针对上面两种解析,有一些公司给出了JAVA的解决方案,例如jaxp,jdom,dom4j。用的比较多的是dom4j。

先要下载jar包进行导入,附上官网地址:https://dom4j.github.io/

这里用的是dom4j-1.6.1.jar。

5.DOM4j的基本使用

public static void main(String[] args) throws DocumentException {
// 创建sax读取对象
SAXReader reader = new SAXReader();
// 指定解析的xml源
Document document = reader.read(new File("src/com/pr/xml/students.xml"));
// 得到根元素
Element rootElement = document.getRootElement();
// 获取元素的名字getName()
System.out.println(rootElement.getName());
// 获取根元素下的stu元素
System.out.println(rootElement.element("stu").getName());
// 获取stu元素下的name元素
System.out.println(rootElement.element("stu").element("name").getName());
// 获取name元素的文本getText()
System.out.println(rootElement.element("stu").element("name").getText());
}

这样子只能获取一个学生的全部信息,如果需要遍历全部:

public static void main(String[] args) throws DocumentException {
// 创建sax读取对象
SAXReader reader = new SAXReader();
// 指定解析的xml源
Document document = reader.read(new File("src/com/pr/xml/students.xml"));
// 得到根元素
Element rootElement = document.getRootElement(); // 得到根元素下一层级的所有元素,也就是两个stu
List<Element> list = rootElement.elements();
for (Element element:list) {
String name = element.element("name").getText();
String age = element.element("age").getText();
System.out.println(name + ":" + age);
}
}

6.DOM4j的XPath使用

(1)首先添加jar包依赖:https://mvnrepository.com/artifact/jaxen/jaxen

这里用的是:jaxen-1.1.1.jar

(2)知道XPath怎么用,具体可以看看W3C

示例代码:

public static void main(String[] args) throws DocumentException {
// 创建sax读取对象
SAXReader reader = new SAXReader();
// 指定解析的xml源
Document document = reader.read(new File("src/com/pr/xml/students.xml"));
// 得到根元素
Element rootElement = document.getRootElement(); // selectSingleNode获取的是第一个,只返回一个
Element nameElement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText()); // 获取xml里面的所有name元素
List<Element> list = rootElement.selectNodes("//name");
for (Element element:list) {
System.out.println(element.getText());
} }

7.XML约束

如下的文档, 属性的ID值是一样的。 这在生活中是不可能出现的。 并且第二个学生的姓名有好几个。 一般也很少。那么怎么规定ID的值唯一, 或者是元素只能出现一次,不能出现多次? 甚至是规定里面只能出现具体的元素名字。

    <stus>
<stu id="10086">
<name>张三</name>
<age>18</age>
<address>深圳</address>
</stu>
<stu id="10086">
<name>李四</name>
<name>李五</name>
<name>李六</name>
<age>28</age>
<address>北京</address>
</stu>
</stus>

XML的约束有两种方式:DTD(.dtd)与Schema(.xsd)

DTD:语法自成一派, 早起就出现的。 可读性比较差。

Schema:其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。
但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD

  • DTD

(1)DTD的基本格式

示例:

    <!ELEMENT stus (stu)>  : stus 下面有一个元素 stu  , 但是只有一个
<!ELEMENT stu (name , age)> stu下面有两个元素 name ,age 顺序必须name-age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无

(2)DTD的引入

1. 引入网络上的DTD

   <!-- 引入dtd 来约束这个xml -->

          <!--    文档类型  根标签名字 网络上的dtd   dtd的名称   dtd的路径

          <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->

2. 引入本地的DTD

      <!-- 引入本地的DTD  : 根标签名字 引入本地的DTD  dtd的位置 -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> --> 3. 直接在XML里面嵌入DTD的约束规则 <!-- xml文档里面直接嵌入DTD的约束法则 --> <!DOCTYPE stus [
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]> <stus>
<stu>
<name>张三</name>
<age>18</age>
</stu>
</stus>
  • Schema

(1)Schema的基本格式

示例:

    <!-- xmlns  :  xml namespace : 名称空间 /  命名空间
targetNamespace : 目标名称空间 。 下面定义的那些元素都与这个名称空间绑定上。
elementFormDefault : 元素的格式化情况。 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/teacher"
elementFormDefault="qualified"> <element name="teachers">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 这是一个复杂元素 -->
<element name="teacher">
<complexType>
<sequence>
<!-- 以下两个是简单元素 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema> 实例文档:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
-->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.w3.org/teacher"
xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
>
<teacher>
<name>zhangsan</name>
<age>19</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
</teachers>

(2)名称空间的作用

一个xml如果想指定它的约束规则, 假设使用的是DTD ,那么这个xml只能指定一个DTD , 不能指定多个DTD 。 但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。简单的说: 一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。

名称空间的作用就是在 写元素的时候,可以指定该元素使用的是哪一套约束规则。 默认情况下 ,如果只有一套规则,那么都可以这么写

<teachers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:aa="http://www.w3.org/teacher"
xmlns:bb="http://www.w3.org/teacher"
xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd" >
<name>张三</name> <aa:name></aa:name>
<bb:name></bb:name>

XML、java解释XML、XML约束的更多相关文章

  1. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  2. JAVA企业级开发-xml基础语法&约束&解析(04)

    一.什么是xml html:超文本标记语言.它主要是用来封装页面上要显示的数据,最后通过浏览器来解析html文件,然后把数据展示在浏览器上.同样我们可以使用JS和DOM技术对html文件进行解析和操作 ...

  3. Java xml 操作(Dom4J修改xml   + xPath技术  + SAX解析 + XML约束)

    1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大 ...

  4. xml语法、DTD约束xml、Schema约束xml、DOM解析xml

    今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的ht ...

  5. PowerProfile.java与power_profile.xml

    转载自http://blog.csdn.net/green1900/article/details/42427871 现在诸多关于电池管理的应用做的极其绚烂,可实现如耗电应用排行.剩余时间计算.关闭耗 ...

  6. java生成解析xml的另外两种方法Xstream

    Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...

  7. Java Ant build.xml详解

    1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为 ...

  8. JAVA bean与XML互转的利器---XStream

    最近在项目中遇到了JAVA bean 和XML互转的需求, 本来准备循规蹈矩使用dom4j忽然想起来之前曾接触过的XStream, 一番研究豁然开朗,利器啊利器, 下来就XStream的一些用法与大家 ...

  9. (转)Java Ant build.xml详解

    1,什么是ant ant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因 ...

  10. JAXB java类与xml互转

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

随机推荐

  1. 【基础】ASP.net MVC 文件下载的几种方法(欢迎讨论)

    在ASP.net MVC 中有几种下载文件的方法 前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的. 第一种:最简单的超链接方法,&l ...

  2. [bzoj] 1030 文本生成器 || AC自动机+dp

    原题 给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串) 正难则反 求有多少个不可辨识的,26^m-不可辨识即为答案 f[i][j]表示填到第i个字符 ...

  3. java 实现多个接口 方法重名的解决办法——内部类

    package com.kk.innerClass; /** * 通过内部类实现接口 * 解决多个接口中方法重名问题 * */interface Machine { void run();} clas ...

  4. dubbox管理中心

    当服务多了,不好管理,可以用管理中心来查看. 管理中心就是一个 web项目(一个war包),可以部署在tomcat下面就能运行了. 用户名密码都是root 每一条服务点开后都可以看生产者和消费者.

  5. oracle数据库解锁

    当我们修改数据库时用for update 或者使用rowId修改后,对表进行了锁定,由于某种原因没有对他进行关闭,我们需要关闭 select b.username,b.sid,b.serial#,lo ...

  6. input file上传图片预览,非插件

    Input标签 <input type="file" name="pic" onchange="changepic(this)" mu ...

  7. ACE接受器-连接器模式

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/22/600191.html 接受器-连接器设计模式(Acceptor-Connector)使分 ...

  8. STL之四:list用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8520891 list容器介绍 相对于vector容器的连续线性空间,list是一个双 ...

  9. UIView的autoresizingMask属性研究

    在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高. 1 2 3 4 5 6 7 8 9 enum  ...

  10. Spring 容器AOP的实现原理——动态代理

    参考:http://wiki.jikexueyuan.com/project/ssh-noob-learning/dynamic-proxy.html(from极客学院) 一.介绍 Spring的动态 ...