一、基本概念
1.XML被设计用来结构化、存储以及传输信息
2.XML没有预定义的标签
3.没有任何行为的 XML
4.常见用途:
1)数据传送通用格式
2)配置文件
3)充当小型数据库
二、XML语法
1.文档声明
1)<?xml version=”1.0” encoding=”编码方式” standalone=”yes|no”?>
2)XML声明放在XML文档的第一行
3)XML声明由以下几个部分组成
(1)version - -文档符合XML1.0规范
(2)encoding - -文档字符编码,比如”gb2312”
(3)standalone - -文档定义是否独立使用,standalone="yes“,standalone=“no” 默认
2.一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范
1)区分大小写,例如,<P>和<p>是两个不同的标记
2)不能以数字或"_" (下划线)开头
3)不能包含空格
4)名称中间不能包含冒号(:)
5)所有 XML 元素都须有关闭标签
3.属性
1)属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)
2)一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">
3)特定的属性名称在同一个元素标记中只能出现一次,属性值不能包括<, >, &
4)如果属性值有单引号,又有双引号,则需要使用实体: html-> ©
4.CDATA节
1)<![CDATA[
……
]]>
2)有些内容可能不想让解析引擎解析执行,而是当作原始内容处理,用于把整段文本解释为纯字符数据而不是标记的情况。包含大量<、>、&或者"字符
3)CDATA节中的所有字符都会被当作元素字符数据的常量部分,而不是XML标记
4)可以输入任意字符(除]]>外),不能嵌套
5)有时我们希望传递一些特殊字符, <>@!#$%^&*( 可以使用 CDATA节包括)
示例:<intro><![CDATA[这个是好$$128qw8o8<Lk;>;akdf0sa98u329408><<K>>>学生]]></intro>
6)如何使用xml去传递小图片——可以把文件读取成一个byte[] ,然后放到 CDATA节,再传递
5.一个xml 文档中,有且只有一个根元素(元素标签节点)
6.对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理
三、dtd(xml文件约束)
1.基本概念
1)dtd ( document type definition 文档类型定义),该文件一般和xml文件配合使用, 主要的用途是约束xml
2)解决xml过于自由的问题
2.实体 <!ENTITY 实体名称 “实体内容”>
1)<!ELEMENT 班级 (学生+)> <!--表示:班级元素内含有至少一个学生元素-->
<!ELEMENT 学生 (名字,年龄,介绍)> <!--表示:学生元素内可以含有名字,年龄,介绍等属性-->
<!ELEMENT 名字 (#PCDATA)> <!--表示:名字属性的值可以包含任何字符串,但是不能含有定义在该dtd中的其他元素-->
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
2)普通实体
(1)语法格式(dtd中定义) <!ENTITY 实体名称 “实体内容”>
3)引用方式(xml中引用)
(1)语法格式(dtd中定义,xml中引用) &实体名称;
(2)示例:在 dtd 中定义 <!ENTITY mycopy "我的公司版权">
在xml中使用 &mycopy
3.IE5以上浏览器内置了XML解析工具:Microsort.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证
4.dtd 分类
1)内部dtd 直接在内部写,不用引入
2) 外部dtd
(1)引入本地dtd <!DOCTYPE 根元素 SYSTEM ‘地址’>
(2) 引入公共的 dtd <!DOCTYPE 根元素 PUBLIC ‘url地址’>
(3) 内外部dtd
<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [
定义内容
]>
四、命名空间
1.在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突
2.XML 命名空间提供避免元素命名冲突的方法,使用前缀来避免命名冲突
3.XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:xmlns:namespace-prefix=“namespaceURI”
4.用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息
五、XML Schema(XSD)
1.基本概念
1)XML Schema 是基于 XML 的 DTD 替代者
2)XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)
3)遵守某个特定的XML Schema的XML文件称为XML Schema的一个实例文档
2.XSD能干什么
1)定义可出现在文档中的元素
2)定义可出现在文档中的属性
3)定义哪个元素是子元素
4)定义子元素的次序
5)定义子元素的数目
6)定义元素是否为空,或者是否可包含文本
7)定义元素和属性的数据类型
8)定义元素和属性的默认值以及固定值
3.Schema文档中,element元素定义了实例文档中可以含有的元素,attribute元素定义了实例文档中特定元素含有的属性,type属性表示对应的实例文档中对应的元素或属性的类型
4.示例
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd >
...内容
</bean>
六、XSLT
七、dom4j
1.dom4j生成xml(常用方法)
1)Document doc = DocumentHelper.createDocument(); // 创建一篇文档
2)创建元素
(1)Element root = doc.addElement("catalog"); // 创建元素,addElement可以返回一个Element
(2)Element journalEl = new BaseElement("journal"); // 创建元素,添加元素节点
root.add(journalEl);
3)journalEl.addAttribute("title", "XML Zone"); // 增加元素属性以及元素属性值
4)authorEl.addElement("firstname").setText("Marcello");
authorEl.addElement("lastname").addText("Vitaletti"); // 设置文本内容(可以链式操作)
5)doc.addDocType("catalog", null,file://c:/Dtds/catalog.dtd); // 设置文档的DOCTYPE
6)String str = doc.asXML();
doc.asXML(); // asXML可以将文档或元素转换成一段xml字符串
root.asXML();
7)output = new XMLWriter(new FileWriter(new File("file/catalog.xml")));
output.write(doc); // XMLWriter类可以把文档写入到文件中
output.close();
8)StringWriter out = new StringWriter();
XMLWriter xmlWriter = new XMLWriter(out, format);
xmlWriter.write(doc); // 输出XML格式字符串s
String s = out.toString();
xmlWriter.flush();
2.dom4j解析xml(常用方法)
1)获取document对象
(1)Document document = DocumentHelper.parseText(text) // 将字符串转换为xml文档
(2)SAXReader reader = new SAXReader();
Document document = reader.read(new File("csdn.xml")); // 读取xml文件,获取document对象
2)Element root = document.getRootElement(); // 获取文档的根节点
3)Element element=node.element(“四大名著"); // 取得某个节点的子节点
4)String text=node.getText(); // 取得节点的文字
5) List nodes = rootElm.elements("csdn");
for (Iterator it = nodes.iterator(); it.hasNext();) { // 取得某节点下所有名为“csdn”的子节点,并进行遍历
Element elm = (Element) it.next();
}
6)Attribute attribute=root.attribute("id"); // 取得某节点下的某属性
7)String text=attribute.getText(); // 取得属性的文字
3.Xpath
1)主要方法
(1) document.selectSingleNode(""); 得到单个元素,如果为多个,默认取第一个
(2) document.selectNodes(""); 得到符合条件的元素集合
2) "/":绝对路径,需要层次分明;
"//":相对路径,获取多个值;
"@":进行条件筛选
3)项目中用到过的示例 String YJHM = docResult.selectSingleNode("//COL[@col_name='YJHM']").getStringValue();
八、jdom
1.jdom生成xml(常用方法)
1) Document doc = new Document(); // 新建一个Document
2) Element root = new Element("root"); // 新建一个根元素 <root> 新建节点
3) root.setName("rootElement"); // 修改根元素 的名字
4) 添加属性
(1)Attribute appntAttr = new Attribute("name", "SAM-SHO");
appntEle.setAttribute(appntAttr);
(2)appntEle.setAttribute("age", "28")
5) 添加文本内容
(1)Text text = new Text("我是被保人,可以这样加文本");
insuredEle.addContent(text);
insuredEle.addContent(" ||我是追加");
(2)appntEle.setText("我是投保人")
6) 在root节点下增加子节点(即在父节点下增加其子节点) ,addContent()会根据添加的类型来,所以感觉什么类型都可以
(1)root.addContent(body)
(2)eleList.add(appntEle);
eleList.add(insuredEle);
root.setContent(eleList);
7) 把根节点增加到doc中
(1)doc.setRootElement(root);
(2)Document doc = new Document(root)
8) format格式化也可以设置编码值,新建输出对象XMLOutputter,调用输出对象发放.outputString(doc)
(1)Format format = Format.getPrettyFormat();
format.setEncoding("GBK");
XMLOutputter out = new XMLOutputter(format);
String xmlStr = out.outputString(doc);
System.out.println(xmlStr);// 打印到控制台
2.jdom解析xml(常用方法)
1)创建一个新的SAXBuilder,都会返回document对象
(1)StringReader read = new StringReader(xmlDoc); // 传字符串
InputSource source = new InputSource(read);
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(source);
(2)SAXBuilder.build(FileInputStream("*.xml") // 传xml文件
2)Element root = doc.getRootElement() // 获取根元素
root.getName(); // 获取元素名称
3)root.getChildren(); // 获取该节点的所有子节点,返回List
4) Element.getChild("child节点名"); // 获取字节点实例
5) Element.getText(); // 获取该节点的节点文本
6) Element.getAttribute("属性名"); // 获取该节点属性名称
root.getAttributes() // 获取该节点下的所有属性名称
7) Attribute.getValue() // 获取该属性的值
九、dom4j与jdom总结
1.优先选用dom4j,且解析用xml比较方便快捷,dom4j可以链式操作
( eg: document.getRootElement().element("insured").addElement("DESC").addText("新加的元素").addAttribute("属性", "值");)
2.生成xml思路:
1)先要有document对象
2)然后生成根节点
3)然后添加其他
4)最后输出
3.解析xml思路:
1)先获取document对象
2)然后找到根节点
3)然后查找其他
4.设置编码可以先调用一个Format类,然后调用里面的setEncoding方法,然后format作为参数传入XMLWriter
参考网址
注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激