java xsd 解析 xml文件_[Java拾遗一] XML的书写规范与解析.

前言

今天天气大好, 起了个大早开始总结一些常用的基础知识.

XML一直来说都很陌生, 使用大多是用于配置文件, 之前并没有细究过其中的约束规范, 今天刚好没事来学习并总结下.

1,XML基础介绍

XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言,很类似 HTML.它的设计宗旨是传输数据,而非显示数据它;标签没有被预定义,需要自行定义标签。

xml的作用:

XML 是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。简单的说,我们在开发中使用XML主要有以下两方面应用.

a.XML做为数据交换的载体,用于数据的存储与传输

b.XML做为配置文件

2,书写规范

注意事项:

xml必须有根元素(只有一个)

xml标签必须有关闭标签

xml标签对大小写敏感

xml的属性值须加引号

特殊字符必须转义

xml中的标签名不能有空格

空格/回车/制表符在xml中都是文本节点

xml必须正确地嵌套

我们将符合上述书写规则的XML叫做格式良好的XML文档。

在讲述XML组成部分前,我们必须对XML的树型结构有所了解.下面是一个简单的XML

Everyday Italian

Giada De Laurentiis

2005

30.00

Harry Potter

J K. Rowling

2005

29.99

Learning XML

Erik T. Ray

2003

39.95

123de663a0a7d7e8334541bcbcd7b557.png

对于一个xml文件,首先必须要有根元素,该元素是所有其它元素的父元素。而在xml中所有元素形成了一棵树。父,子及同胞等术语描述了元素之间的关系。所有的元素都可以拥有子元素。相同层级上的子元素成为同胞。

所有元素都可以拥有文本内容和属性。

Root  根元素

Element 元素

Attribute 属性

Text  文本

在开发中,我们将上述内容也统称为Node(节点)。

3,xml的作用详解

1.不同语言之间交换数据-- 用数据库代替

2.配置文件-- ☆

xml的约束:

作用:明确的告诉我们那些元素和属性可以写,以及他们的顺序如何.

分类:DTD约束和SCHEMA约束

要求:给你xml约束你可以写出对应的xml文档即可.

1, DTD约束:struts hibernate中有使用

与xml文档的关联:

方式1:内部关联

格式:dtd的语法]>

方式2:外部关联--系统关联

格式: "dtd路径">

dtd的后缀名是 .dtd

方式3:外部关联--公共关联

格式:名称" "dtd路径">

元素:

格式1:

格式2:

属性:

格式:

属性的类型:

ID:唯一

CDATA:文本

默认值:

REQUIRED:必须出现

IMPLIED:可以选择

类别:

#PCDATA:文本是一个字符串,不能出现子元素 ,用的时候用(#PCDATA)

符号:

+     >=1

?     0|1

*     任意值

|     选择

()    分组

,     顺序

DTD约束示例代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

]>

Everyday Italian

Giada De Laurentiis

2005

30.00

Harry Potter

J K. Rowling

2005

29.99

Learning XML

Erik T. Ray

2003

39.95

View Code

2,SCHEMA约束:spring中使用的就是schema约束

作用:用来替代dtd的,多个schema可以出现一个xml文档上

需求:

xml 文档中出现了

a约束上的---table :桌子 属性  height width

b约束上的---table :表格 属性  rows  cols

名称空间:

作用:用来确定标签的约束来自于那个约束文档上

格式:

方式1:xmlns="名称"

方式2:xmlns:别名="名称"

例如:

table  代表的是桌子

b:table 代表的就是表格

schema的语法:

后缀名.xsd

关联

1.约束文件的关联 bookstore.xsd

xmlns="http://www.w3.org/2001/XMLSchema"-- 固定值,自定义的约束文件可以出现那些标签

targetNamespace="http://www.example.org/bookstore"

给当前的xsd起个名称空间,方便目标xml文件引用,名字可以随便起,一般使用域名/自定义名称既可以

例如: targetNamespace="bookstore"

targetNamespace="http://www.augmentum.com/bookstore"

确定一个目标xml根元素

2.xml文件的关联

写根标签

添加schema约束

1.xmlns="约束的名称空间" -- 值为xsd文件上的targetNamespace的内容

例如:

xmlns=="http://www.augmentum.com/bookstore"

2.xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" :固定的写法 声明此文档是一个

被schema约束的文件

3.确定文档的位置

xsi:schemaLocation="{和xsd文件中的targetNamespace} {xsd文件的路径}"

关联小结:

先有约束文件. .xsd

targetNamespace 就是给当前的约束文件起个名字,方便xml使用

必须确定根元素

后有xml文件.

写根元素

添加约束

xmlns="名字"  他的值为targetNamespace中起的名称

xsi:schemaLocation="名字 位置"

语法:

1.确定根元素

name:元素的名称

type:元素的数据类型

2.确定元素类型

复杂的元素

简单的元素 -- 几乎看不见

3.确定顺序:

  按次序 相当于  dtd 中,

随意

或 相当于dtd中的 |

maxOccurs 最大的出现次数    值为unbounded指的是无上限

minOccurs 最小的出现次数

4.确定属性

name :属性的名称

type:属性的数据类型

use 相当于dtd中 默认值

值为required:必须出现

值为optional:可选

5.若有属性的元素,内容只是文本

  --- 指定元素为复杂类型

--- 指定元素是一个简单的内容,只有文本

    -- 文本内容进行扩展

-- 添加属性

Schema约束示例:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

bookstore.xsd

4, xml解析

获取xml中的内容

解析方式:SAX和DOM

区别:

sax:逐行的解析,不能增删改

dom:把整个文档加载到内存中,翻译成一棵树,就可以进行crud操作

要求:

会查询(获取)

DOM4J的解析(只需会查询操作)

1.导入包

2.获取document

3.获取根元素

4.获取其他节点

常用的方法: ☆

SAXReader reader=new SAXReader();

Document doc=reader.read(文件路径);

获取根元素:

Element root=doc.getRootElement();

获取其他节点:

获取属性

List bookList=root.elements();

获取book的属性

String value=bookElement.attributeValue("category");

bookElement.elementText("title");--获取title的文本内容

扩展方法:

获取book

Iterator it = root.elementIterator();

获取属性:

bookElement.attribute("category").getValue();

获取文本

bookElement.element("title").getText();

示例解析1:

xml代码

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Everyday Italian

Giada De Laurentiis

2005

30.00

Harry Potter

J K. Rowling

2005

29.99

Learning XML

Erik T. Ray

2003

39.95

View Code

解析代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public static void main(String[] args) throwsDocumentException {//获取Document

Document document = new SAXReader().read("D:/Users/WangMeng/workspace/day08_XML/dtd/bookstore.xml");//获取根元素

Element root =document.getRootElement();//获取其他节点

/*获取其他节点方法一

List bookList = root.elements();

for (Element bookElement : bookList) {

//获取属性

//String value = bookElement.attributeValue("category");

//System.out.println(value);

//获取子标签的文本内容

String textValue = bookElement.elementText("title");

System.out.println(textValue);

}*/

//获取其他节点方法二

Iterator it =root.elementIterator();while(it.hasNext()) {

Element bookElement=it.next();//获取属性//String value = bookElement.attribute("category").getValue();//获取元素, 元素内容

String value = bookElement.element("title").getText();

System.out.println(value);

}

}

View Code

X-path解析(获取)

selectNodes(string):获取集合 //book

selectSingleNode(string):获取的单一的元素,若匹配的是一个集合的话,只取第一个

使用之前导入 jaxen-1.1-beta-6.jar

关于Xpath更详细的可以去w3c文档看xml中关于xpath的api.

示例解析2:

xml代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Everyday Italian

Giada De Laurentiis

2005

30.00

Harry Potter

J K. Rowling

2005

29.99

Learning XML

Erik T. Ray

2003

39.95

View Code

解析代码:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public static void main(String[] args) throwsDocumentException

{//获取Document

Document document = new SAXReader().read("D:/Users/WangMeng/workspace/day08_XML/dtd/bookstore.xml");//获取category="WEB"的book元素

/** 路径匹配: /a/b/c

* 元素匹配 : //c

* 属性匹配: //c[@属性='属性值']

* 含有子元素: //c[d]

*

**/

//Element bookElement = (Element)document.selectSingleNode("//book[@category='WEB']");

Element bookElement = (Element)document.selectSingleNode("//book[price > 35]");

System.out.println(bookElement.attributeValue("category"));

}

View Code

关于xml的内容就到这里了, 相信看完这些内容 以后再也不担心xml的约束以及解析了.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值