xml全解析

来源:互联网 发布:加密软件 dg 编辑:程序博客网 时间:2024/06/06 04:04
XML含义?
1、可扩展的标记语言;(可扩展的标签语言<>)
2、设计用来传输和储存数据;
3、允许开发人员自定义标签的名字,但要符合一定的规范;
XNL和htnl的区别?
1、xml不是替代html,有各自的功能;
2、xml设计用来传输和储存数据,重点在于数据;
3、html设计用来显示数据,重点是数据的显示;(超文本标记语言)

XML的作用?
1、都是用来传输数据的对象;
2、主要是用于传输存储数据(各平台之间程序直接交流困难【xml在不同的文本格式之间实现数据交换,用java虚拟机解析。】
程序之间交流困难,如何实现数据交换的无二义性地传递数据【用普通文本】xml解析javaBEAN和JSON),实现数据持久化;

各种语言之间的关系:
HTML:显示层; //swing做小工具的界面;
javaWEB:服务器编程、客户端编程,xml解析;
JAVAEE:xml配置;

DTD(文档类型定义):document type definition
主要用来约束xml文档书写的规范;
类型:xml DTD 【web用】
xmlScheme 【J2EE用】

xml文档组成:

一、序言:XML申明<?xml version="1.0" encoding="UTF-8"?>、处理指令、
文档类型定义【DTD/Scheme】:<!DOCTYPE 根元素 (PUBLIC|SYSTEM)>
PUBLIC:如果写public表示约束的文件来自于网络文件。
第一个表示dtd的名字,第二个表示url,寻找约束文件的网址;
[案例]:
SYSTEM“test.dtd:表示当前约束条件来自本地的dtd文件, 后面直接找到路径;

test.dtd文件:
内容:约束每个元素下的子元素;各个元素内的属性; 各个子元素的子元素;
元素规范:<!ELEMENT 元素名 (子元素名,子元素名)> 元素约束语法;
子元素规范:【?可以出现0次或1次 / +必须出现1次或者多次 *允许出现任意次 ,必须按照指定顺序出现 | 表示不管顺序,可出现可以不出现】
文本规范:(#PCDATA:该元素下面只能放文本元素,)
属性规范<!ATTLIST 元素名称 属性名字 属性类型 属性的特点>
属性类型:CDATA 属性值可以是任何字符
ID 该属性取值必须唯一,不能以数字开头;
IDREF:类似于外键;
属性特点:#IMPLIED 可以有可以不有;
#REQUIRED 必须要有属性
#FIX value : 必须有一个固定的值,没有就报错;
Default value : 如果这个属性没有值,就分配一个默认的值给他;
注释:注释不能嵌套、不能写在标记中间;

二、文档元素:根元素[一个xml文件有且仅有一个根元素]、元素(book)、属性(id)、文本(马士兵)
【实际案例】
插入图片:
C语言:谭浩强;
<bookstore>
<book id="1">
<bookname>JAVA基础</bookname>
<author>马士兵</author>
<pagenum>1000</pagenum>
</book>
<book id="2"></book>
</bookstore>
XML规范:

<: &lt; >: &gt; &:&amp;
属性值:1/用“”,‘’分隔;
2/<元素名 属性名=“属性值”>
3/属性值不包含</>&
CDATA:文本内的内容不会被改变,不会被标记,实体不会被展开(与注解相似);换行,空格会被解析;
XML结构必须是完整的文档: 有声明、有一个根元素、标记大小写敏感、属性值用引号、标记成对、空标记关闭、元素正确嵌套;

XML元素语法:
1、不能以字母、数字、其他字符;
2、不能以数字和下划线“_”开头
3、不能以XML/xml/Xml开头
4、名称中不含空格
5、名称中不含冒号,冒号留给命名空间使用;

XML技术体系概述

A、文档与校验技术:DTD规范,Schema规范;校验我们书写文档是否符合要求技术;
B、文档转换技术:XSL/XSLT技术
内容和格式分离,xml不包含如何显示数据,xls解决了xml数据显示的问题;
xsl、xslt可以随意将xml文档转换为html、pdf;
C、文档查询技术:XPath/Xquery
数据库和SQL之间的关系(关系型数据库用sql进行查询工作);
D、文档解析技术:XML DOM/SAX
【Dom4J 是两者结合的方法。用的人比较多的一种技术,是第三方提供的,必须导入第三方JAR;】
DOM,基于文档对象模型;基于树结构的API;定义了一组接口,这些接口可以用来解析创建我们的xml文档,是基于对象的,与平台和语言无关的; 【特点】:整个文档必须在内存解析和储存,因此对大型文档来说,耗内存,占用资源严重; 也因为数据都在内存,解析获取数据效率高
sax:是xml、简单应用程序的接口,sax解析文档时基于事件驱动,并且使用回调机制通知桌面应用程序; 【特点】:基于事件驱动的模型,标签一个一个的解析,开始标签和结束标签对应不同的事件,不会将整个文档加载到内存,所以不会浪费内存资源;
缺点:1、要到达指定的位置,按照顺序处理,不能随机访问。
2、sax只读。(无法修改)
3、文档只能遍历一次。
【过程描述】核心类为hander类,触发事件,首先指向元素,调用方法startelent()方法【中间发现本标签的属性,之后hander指针指向下面一个元素,并获取属性】找到元素的结束标签触发endelent()方法,
E、文档连接和定位技术: XLink/XPointer
文档定位技术,可以定位节点和节点集;


工具:eclispse

在JAVA中创建XML文件;导入包为dom4、jaxen包的类;
dom4j创建:
1、通过类产生一个文档对象(DocumentHelper.createDocment());
2、通过对象创建一个根元素(Element elm = document.addElement("user"););
3、创建一个注释(根元素.addComment("this is user"));
4、创建一个子节点:(根元素.addElement("username"));
5、给子节点创建属性:(根元素.addAttribute("class","info"));
6、创建一个密码子节点:(pwdEle = 根元素.addElement("pwd"));
7、给密码子节点增加属性和节点之间的文本值:pwdEle.addAttrribate("Level","2");
8、设置密码子节点的文本值:pwdEle.setText

9、添加文档类型:document.addDocType(定义根元素,获取文档路径,定义文档名字);
docment.addDocType("user", null, null);
10、设置输出格式:OutputFormat opf = OutputFormat.createPreettyPrint();
opf.setEncoding("gbk");
11、创建好的xml文件输出到硬盘
File f = new File("c:"+File.separator+"dom4j.xml"); 在XX路径创建了文件f;
File.separator:斜杠 /

XMLWriter w = new XMLWriter (outPutStream( f ),opf); 写到f文件按照gbk格式进行输出;
w.write(document); 第一步创建的对象;

/*
源代码:
public class WriteDom {
//创建一个xml文件
public void createDocument(){
//DocumentHelper通过类产生一个文档对象
Document document = DocumentHelper.createDocument();
//通过document对象创建一个根元素
Element userElement = document.addElement("user");
//创建一个注释
userElement.addComment("this is user");
//创建一个子节点
Element usernameEle = userElement.addElement("username");
//给usernameEle节点创建属性
usernameEle.addAttribute("class", "info");
usernameEle.addAttribute("id", "username1");
//创建一个密码子节点
Element pwdEle = userElement.addElement("pwd");
//给当前pwdEle节点增加属性和节点之间的文本值
pwdEle.addAttribute("level", "高");
//设置密码节点的文本值
pwdEle.setText("asd1234567");
//usernameEle.setText("xiao wang");
Element firstEle = usernameEle.addElement("firstName");
Element lastEle = usernameEle.addElement("lastName");
firstEle.setText("xiao");
lastEle.setText("wang");
//添加文档类型
document.addDocType("user",null,null);
//设置输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
//将创建好的xml内容输出到硬盘
File f = new File("dom4j.xml");
try {
//将创建好的内容输出到硬盘
XMLWriter w = new XMLWriter(new FileOutputStream(f),format);
//document表示当前输出内容输出到文档上面
w.write(document);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
WriteDom d = new WriteDom();
d.createDocument();
}
}
*/

SAX读取文件对象:
建立全局变量,document
读取文件方法:
SAXReader saxRead = new SAXReader();
document = saxRead.read( new File("文件路径") );
修改属性方法
获取username节点的属性,
List list = document.selectNodes("//username/@class"); //username元素的class属性
Interator it = list.Interator(); //用迭代器去遍历list;
while(it.hasNext()){
Attribute attr = (Attribute ) it.next(); [细节:it.next()一个对象只能使用一次,]
attr.getName() 属性名
attr.getValue() 属性值
attr.getNodeType() 属性类型(元素:1,属性:2,文本:3)

//设置属性值;
attr.setValue("message"); 【细节:这里的修改并没有修改文档的值】

修改元素的方法:
List list = document.selectNodes("//username/firstName"); //username元素的class属性
Interator it = list.Interator(); //用迭代器去遍历list;
while(it.hasNext()){
Element attr = (Element) it.next(); [细节:it.next()一个对象只能使用一次,]
attr.getName() 属性名
attr.getText() 文本

//设置属性值;
attr.setText("message"); 【细节:这里的修改并没有修改文档的值】


将修改的值放进文档方法
/*
public class UpdateXml {
private Document document;
//读取文件
public void readXml(){
//通过sax读取到文件对象
SAXReader saxRead = new SAXReader();
try {
document = saxRead.read(new File("dom4j.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//修改属性
//获取到username节点的属性 //username/@class
public void updateAttr(){
List list = document.selectNodes("//pwd/@level");
Iterator it = list.iterator();
while(it.hasNext()){
//获取到的是属性对象
Attribute attr = (Attribute)it.next();
//获取到属性的名字和值,
System.out.println(attr.getName()+" "+attr.getValue()+" "+attr.getNodeType());
//设置当前class的属性值
attr.setValue("message");
}
}
//修改元素的值
public void updateElement(){
List list = document.selectNodes("//username/firstName");
Iterator it = list.iterator();
while(it.hasNext()){
Element ele = (Element) it.next();
System.out.println(ele.getName()+" "+ele.getText());
ele.setText("dawang");
}
}
//将文档写入到文件里面
public void writeDom(){
//添加文档类型
//document.addDocType("user",SYSTEM,"test.dtd");
OutputFormat format = OutputFormat.createPrettyPrint();
//将创建好的xml内容输出到硬盘
File f = new File("dom4j.xml");
try {
//将创建好的内容输出到硬盘
XMLWriter w = new XMLWriter(new FileOutputStream(f),format);
//document表示当前输出内容输出到文档上面
w.write(document);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
UpdateXml x = new UpdateXml();
x.readXml();
/*x.updateAttr();
x.writeDom();*/
x.updateElement();
//x.writeDom();
}
}
*/
0 0
原创粉丝点击