当Java遇到XML 的邂逅+dom4j
XML简介:
XML:可扩展标记语言!
01.很象html
02.着重点是数据的保存
03.无需预编译
04.符合W3C标准
可扩展:我们可以自定义,完全按照自己的规则来!
标记: 计算机所能认识的信息符号!
int num=5; 教材编号
XML的组成部分:
01.文档声明 <?xml version="1.0" encoding="UTF-8"?>
02.元素 <p></p>
03.属性 <p id="haha"></p>
04.注释 <!-- -->
05.特殊字符
06.CDATA区域 Character data 字符數據
07.处理指令 引入css样式
<phone>
<brand name="小米">
<edition name="1.0">
<hehe>hehe</hehe>
<hehe>为发骚而生</hehe>
</edition>
<edition name="2.0"/>
</brand>
<brand name="华为">
<edition name="1.0"/>
<edition name="2.0"/>
</brand>
<brand name="苹果">
<edition name="1.0"/>
<edition name="2.0"/>
</brand>
</phone>
注意点:
01.xml文件中只能有一个根节点
02.节点要成对出现 有开发和闭合
03.节点必须正确的嵌套
04.严格区分大小写
05.空格和换行都是特殊字符 会被解析器解析
xml,html都是一个类似于倒挂的树!
只有一个根节点,枝叶茂盛!
我们把这个倒挂的树称之为===》dom树!
DOM:(Doucument Object Model)文档对象模型!
特殊字符:
> >
< <
& &
' '
" "
CDATA区域:
XML解析器不会处理,而是当成字符串原样输出!
语法:
<![CDATA[xml内容]]>
创建第一个maven项目:
1.new project===>maven==>quick==>archetypeCatalog=internal
2.引入需要的pom节点
3.自定义一个xml文件 (学校 年级 班级)
4.需求通过dom4j实现查询学校下面的年级以及班级信息
5.创建一个测试类 书写代码
具体操作请看:
https://www.cnblogs.com/lsy131479/p/9237154.html
解析xml文件的方式:
01.DOM:基于xml文档树结构的解析,把xml文件中的内容都读取到内存中,
比较占内存,消耗资源多!
02.SAX:基于事件的解析。消耗资源小!
03.JDOM:针对于java的特定模型!满足2 8原则!自身没有解析器,依赖于SAX2!
04.DOM4J:for(4)JDOM的一个分支!源码开放,性能优异,功能强大!
DOM4J解析xml
1. 导入dom4j jar包
解析代码:
package com.metro.util; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Scanner; /**
* @author 房上的猫
* @create 2018-06-28 11:42
* @博客地址: https://www.cnblogs.com/lsy131479/
* <p>
* 测试
**/ public class Test {
static Scanner input = new Scanner(System.in);
static Document doc = null;
static Element root = null;
//常量路径
static final String URL = "src/main/resources/phone.xml";
//主程序
public static void main(String[] args) { System.out.println("***1.查询所有");
System.out.println("***2.修改");
System.out.println("***3.删除");
System.out.println("***4.添加");
System.out.print("*************请选择:");
int choose = input.nextInt();
getDocument();
System.out.println("==============start==============");
switch (choose) {
case 1:
Iterator<Element> brands = root.elementIterator();
findAll(brands, 0);
break;
case 2:
up();
break;
case 3:
del();
break;
case 4:
add();
break;
}
System.out.println("==============exit==============");
}
//添加
private static void add() {
Element brand = root.addElement("brand");
brand.addAttribute("name", "hehe");
Element edition = brand.addElement("edition");
edition.addAttribute("name", "xx");
edition.addText("ssss");
saveXML();
}
//删除
private static void del() {
Iterator<Element> brand = root.elementIterator();
while (brand.hasNext()) {
Element next = brand.next();
// System.out.println(next.attributeValue("name"));
if (next.attributeValue("name").equals("haha")) {
root.remove(next);
}
}
saveXML();
}
//修改
private static void up() {
Iterator<Element> brand = root.elementIterator();
while (brand.hasNext()) {
Element next = brand.next();
// System.out.println(next.attributeValue("name"));
if (next.attributeValue("name").equals("hehe")) {
next.setAttributeValue("name", "haha");
}
}
saveXML();
}
//保存xml
private static void saveXML() {
XMLWriter writer = null;
OutputFormat format = null; try {
format = OutputFormat.createPrettyPrint();
writer = new XMLWriter(new FileWriter(URL), format);
writer.write(doc);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//查询所有
private static void findAll(Iterator<Element> brands, int count) {
String t = "";
//设置缩进
for (int i = 0; i < count; i++) {
t += "\t";
}
while (brands.hasNext()) {
Element brand = brands.next();
System.out.println(t + "name:" + (brand.attributeValue("name") == null ? "" : brand.attributeValue("name")));
System.out.println(t + "text:" + brand.getTextTrim());
//预先构建子节点迭代器
Iterator<Element> iterator = brand.elementIterator();
//递归
findAll(iterator, ++count);
} } //初始化
public static void getDocument() {
SAXReader reader = new SAXReader();
try {
doc = reader.read(URL);
root = doc.getRootElement();
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
DTD:
Document Type Definition(文檔類型定義)
01.规范我们的编码
02.在浏览器中正常的显示
<!ELEMENT school (grade+),(class|student)>
ELEMENT :元素,关键字
school:元素名称
grade:子元素或者元素类型 CDATA PCDATA (Parse)解析数据,不能包含子元素
():用来给元素分组
| :两者必须选择一个
+ : 1-N,至少出现一次
* : 0-N,可有可无,并且可以多次
?: 0|1,最多一次
,:元素出现的顺序
DTD文档使用方式:
01.内部DTD
<!DOCTYPE 根元素[定义的内容]>
02.外部DTD
<!DOCTYPE 根元素 SYSTEM "dtd文件位置">
02.内外部DTD
<!DOCTYPE 根元素 SYSTEM "dtd文件位置"[定义的内容]>
DTD例子:
xml文件抬头:
<!DOCTYPE phone SYSTEM "phone.dtd">
phone.dtd 约束文件:
<!ELEMENT phone (brand*)>
<!ELEMENT brand (edition*) >
<!ATTLIST brand name CDATA "XX">
<!ELEMENT edition (hehe*) >
<!ATTLIST edition name CDATA "XX">
<!ELEMENT hehe (#PCDATA) >
<!ATTLIST hehe name CDATA "XX">
<!--
#PCDATA:被解析的字符数据
CDATA:默认值
*:出现0或多次
+:出现最少一次
-->
my.html 测试文件:
仅兼容低版本IE
<html>
<head>
<!--自己编写一个简单的解析工具,去解析XML DTD是否配套-->
<script language="javascript">
// 创建xml文档解析器对象
var xmldoc =new ActiveXObject("Microsoft.XMLDOM"); // 开启xml校验
xmldoc.validateOnParse = "true";
// 装载xml文档,即指定校验哪个XML文件
xmldoc.load("phone.xml");
document.writeln("错误信息:"+xmldoc.parseError.reason+"<br>");
document.writeln("错误行号:"+xmldoc.parseError.line);
</script> </head>
<body> </body>
</html>
总结:
1.xml html
2.特点,注意事项
3.maven项目创建的注意点
4.手写xml
5.解析xml的几种方式
6.dom4j解析的步骤
最新文章
- 【原创】开源Math.NET基础数学类库使用(09)相关数论函数使用
- web性能优化:详说浏览器缓存
- mallmold开源商城系统网银在线chinabank支付插件
- h264 profile &; level
- 如何在A用户下建立视图,这个视图是A的表与B的表进行关联的?
- 关于 CAS 不能登录的问题
- HDU 2176 取(m堆)石子游戏(Nim)
- Word Frequency
- oracle 查詢表字段明細、字段注釋、表註釋
- jquery定义表格宽度
- angular 服务
- java:访问权限-protected实例
- 如何测试mysql是否安装成功
- input text 不可编辑的解决办法
- Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示
- SQLite数据库操作 (原始操作)
- 每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作
- 对requestAnimationFrame的一点理解
- Floyd最短路(带路径输出)
- 转MySQL遇到的语法差异及解决方案