当Java遇到XML 的邂逅+dom4j
Posted 房上的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当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解析的步骤
以上是关于当Java遇到XML 的邂逅+dom4j的主要内容,如果未能解决你的问题,请参考以下文章