xml 是 可扩展标记语言(Extensible Markup Language)
xml 是一种标记语言,类似HTML
xml 设计宗旨是传输数据,而非显示数据
xml 标签没有被预定义
xml 符合W3C标准
html 和 xml 的区别
xml 不是html 的替代
两者设计的目的不同
xml 被设计为传输数据,存储数据
html 被设计用来显示数据
HTML 语法相对松散,xml比较严格
HTML 标签都是预定义的,xml标签都是自己定义的
XML用处
数据存储,配置文件,数据传输
文档声明
<?xml version="1.0"?> 必须写在第一行
设置为utf-8
<?xml version="1.0" encoding="UTF-8"?>
语法规则
标签元素必须有关闭标签,成对存在 <e></e>
区分大小写 <E></E> 和 <e></e> 两者不一样
根元素有且只有一个
特殊符号
< 等于 <
> 等于 >
& 等于 &
' 等于 '
" 等于 "
标签命名规则
*不能以数字或标点符号开头
*不能以xml开头
*不能包含空格
原样输出
xml.pngxml 约束
规定文档中只能写哪些标签,并且会给一些提示。
约束分类为:DTD约束 、chema
schema 可以对标签元素的属性值进行约束,而dtd不行。
具体可以到 http://www.w3school.com.cn/ 进行学习
http://www.w3school.com.cn/dtd/index.asp DTD
http://www.w3school.com.cn/schema/index.asp Schema
DTD:内部DTD(很少用)、外部DTD(可以本地加载<!doctype rootname system "name" '',和网络加载)
- 至少有一个
? 0个或者1个
- 0个或者多个
什么都没有表示默认的一个
给标签元素添加属性
<!ATTLIST ele=标签元素 attrName=属性名字 attrType=属性类型 introduce=属性说明 >
属性类型主要有以下类型:
PCDATA 字符串
ID 唯一
ENUMERED
ENTRY 实体对象
属性说明主要有以下几种类型:
REQUIRED 必须有的
IMPLEMENTED 可以没有
FIXED 固定的不能变的
xml 解析
dom解析
dom Document Object Model 文档对象模型
在加载时,一次性的把整个xml文档加载进入内存。在内存中形成dom对象。
由于操作的是内存中的dom,所以更改后,需要同步到xml文件中
由于xml文件可能过大。可能早出内存溢出。
dom解析步骤
1、创建解析器工程
2、通过工厂得到解析器
3、通过解析器获得dom对象
4、通过dom对象可以获取具体的节点
创建dom解析工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
获取解析器
DocumentBuilder db = dbf.newDocumentBuilder();
使用解析器来加载xml文件。获得dom对象
Document dom = db.parse("src/com/lz/parse/student.xml");
获取年龄节点
NodeList ageNodes = dom.getElementsByTagName("age");
获取需要修改的节点
Node ageNode = ageNodes.item(0);
修改节点值
ageNode.setTextContent("30");
从内存同步到xml文档
TransformerFactory tfFactory = TransformerFactory.newInstance();
Transformer tf = tfFactory.newTransformer();
Source xmlSource = new DOMSource(dom);
Result outputTarget = new StreamResult("src/com/lz/parse/student.xml");
tf.transform(xmlSource, outputTarget);
//创建一个节点 Element 是 Node 子类
Element eleAddress = dom.createElement("address");
//设置节点内容
eleAddress.setTextContent("浙江杭州");
//获取需要添加的父节点
Node nodeStudent = dom.getElementsByTagName("student").item(0);
nodeStudent.appendChild(eleAddress);
//写入xml文件
Transformer tf = TransformerFactory.newInstance().newTransformer();
DOMSource ds = new DOMSource(dom);
Result target = new StreamResult("src/com/lz/parse/student.xml");
tf.transform(ds, target);
//删除节点
//获取需要删除节点
Node nodeAddress = dom.getElementsByTagName("address").item(0);
//获取父节点,由父节点移除节点
Node parentNode = nodeAddress.getParentNode();
parentNode.removeChild(nodeAddress);
//同步到xml文档
Transformer tf = TransformerFactory.newInstance().newTransformer();
DOMSource ds = new DOMSource(dom);
Result target = new StreamResult("src/com/lz/parse/student.xml");
tf.transform(ds, target);
//给节点添加属性
Node nodeStu = dom.getElementsByTagName("student").item(1);
//node 节点是没法添加属性的。需要用其子类 element来添加。
Element ele = (Element) nodeStu;
ele.setAttribute("id", "0001");
//同步到xml文件
Transformer tf = TransformerFactory.newInstance().newTransformer();
DOMSource ds = new DOMSource(dom);
StreamResult target = new StreamResult("src/com/lz/parse/student.xml");
tf.transform(ds, target);
DOM4j
是dom4j.org 出品的开源xml解析包
性能优异,功能强大,比官方sun公司的dom技术更好。
hibernate也使用来配置文件。
读取为dom对象
SAXReader reader = new SAXReader();
Document dom = reader.read("src/com/lz/dom4j/student.xml");
获取节点
//获取根元素
Element rootElement = dom.getRootElement();
//
List<Element> listStudent = rootElement.elements("student");
for (Element eleStudent : listStudent) {
String name = eleStudent.element("name").getText();
String age = eleStudent.element("age").getText();
System.out.println("姓名:"+name+", 年龄:"+age);
}
System.out.println("---------------------------------------");
for (Element eleStudent : listStudent) {
String sname = eleStudent.elementTextTrim("name");
String sage = eleStudent.elementTextTrim("age");
System.out.println("姓名:"+sname+", 年龄:"+sage);
//获取属性值
String num = eleStudent.attributeValue("number");
System.out.println("number:"+num);
}
添加节点
Element rootElement = dom.getRootElement();
Element eleStu = rootElement.addElement("student").addAttribute("number", "lk_0003");
eleStu.addElement("name").setText("王五");
eleStu.addElement("age").setText("20");
eleStu.addElement("sex").setText("male");
OutputFormat format = OutputFormat.createPrettyPrint();
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("src/com/lz/dom4j/student.xml"), "UTF-8");
XMLWriter xmlWriter = new XMLWriter(out,format);
xmlWriter.write(dom);
//一定要关闭否则无法写入文件
// out.close();
xmlWriter.close();
网友评论