JAVA高级工程师课程笔记整理——(五)XML解析
来源:互联网 发布:淘宝违规12分 编辑:程序博客网 时间:2024/05/22 16:00
(五)XML解析
xml
xml和Html关系密切
XML与操作系统、编程语言的开发平台无关
实现不同系统之间的数据交换
作用:
数据交互
配置应用程序和网站
Ajax基石 (异步交互)
xml可以用浏览器打开
语法:
属性值用双引号包裹
一个元素可以有多个属性
属性值中不能直接包含<、“、&(不建议:‘、>)
嵌套错误
<title><name>XML编程</title></name>
myeclipse 格式化
Ctril+Shift+F
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格
特殊字符:
< <
> >
很多个特殊字符:
<![CDATA[特殊字符]]>
xml约束:
命名空间
重点:
解析XML
DOM解析:
基于xml文档树的解析
SAX解析:
基于事件的解析
DOM4j解析:
开源,优异
a.DOM解析 (javascript DOM模型)
XML编程
1.xml编程的两种解析方式
1.1 dom解析
优点:一次加载,多次使用。可以方便的对xml文档进行增删改查
缺点:如果xml文档过大的话,加载的时候会比较占用内存空间比较大,消耗资源,时间长。
1.2 sax解析
优点:一行行读取加载,占用空间少,消耗内存资源少,时间短。
缺点:如果下次使用还得重新加载,只适合查询操作,不适合增删改。
针对加载一次使用一次的问题,可以采取针对性的措施,即在加载的时候可以保存在集合中进行存储。
2.xml解析开发工具包
2.1 jaxp sun公司推出的,集成在j2se中。
2.2 dom4j
3.使用jaxp对xml文档进行dom解析
步骤:1.获取解析器工厂对象
DocumentBuilderFactory newInstance
2.获取解析器
DocumentBuilder new DocumentBuilder
3.解析xml文档,获取Document对象
Document builder.parse();
4.1 查询节点名称
Element ele = dom.getElementByTagName("xxx").item(index);
String name = ele.getTextContent();
syso(name);
4.2 修改节点名称
Element bookEle = (Element) dom.getElementsByTagName("书名").item(0);
bookEle.setTextContent("你懂得");
//更新xml
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new FileWriter("book.xml")));
4.3 添加节点
//添加自定义节点 ,设置标签体
Element price2 = dom.createElement("特价");
price2.setTextContent("99.00元");
//获取父节点
Element parent = (Element) dom.getElementsByTagName("书").item(0);
//将自定义节点挂载到父节点
parent.appendChild(price2);
//更新xml
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new FileWriter("book.xml")));
4.4 删除节点
//获取要删除的节点名称
Element price2Ele = (Element) dom.getElementsByTagName("特价").item(0);
//获取父节点
Element parent = (Element) price2Ele.getParentNode();
parent.removeChild(price2Ele);
//更新xml
4.5 在指定位置增加节点
//创建节点,并设置标签体
Element price2Ele = dom.createElement("特价啦");
price2Ele.setTextContent("100000.99元");
//获取指定位置的节点
Element ele = (Element) dom.getElementsByTagName("售价").item(0);
//获取指定位置父节点
Element parent = (Element) ele.getParentNode();
//增加节点
parent.insertBefore(price2Ele, ele);
4.6 获取属性
//获取所需修改属性所在的元素
Element ele = (Element) dom.getElementsByTagName("书").item(1);
//获取属性
System.out.println(ele.getAttribute("出版社"));
4.7 修改属性
//获取所需修改属性所在的元素
` Element ele = (Element) dom.getElementsByTagName("书").item(1);
//设置属性
ele.setAttribute("出版社", "大中国出版社");
//更新xml
4.8 添加属性
//获取所需修改属性所在的元素
` Element ele = (Element) dom.getElementsByTagName("书").item(1);
//设置属性
ele.setAttribute("出版社", "大中国出版社");
//更新xml
4.9 删除属性
//获取需要删除的属性所在的元素
Element ele = (Element) dom.getElementsByTagName("书").item(1);
//删除属性
ele.removeAttribute("书号");
//更新xml
4.10 遍历所有节点
public static void getAllNodes(Node node) {
// 判断如果是node,则打印标签名
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
//判断是否是Element或者Document类型,如果是则判断有没有孩子
if (node.getNodeType() == Node.ELEMENT_NODE
|| node.getNodeType() == node.DOCUMENT_NODE) {
// System.out.println(node.getNodeName());
//如果有孩子进行递归遍历
if (node.hasChildNodes()) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
getAllNodes(list.item(i));
}
}
}
//判断如果是标签体,则打印标签体的内容
if (node.getNodeType() == node.TEXT_NODE) {
System.out.println(node.getTextContent());
}
}
4.使用jaxp对xml文档进行sax解析
sax解析采用事件处理的方式来解析,涉及两个部分解析器和事件处理器。
sax解析器可以使用jaxp的api创建,创建完成后就可以去解析指定的xml文档了。
sax每当读取到xml文档的一部分,都会调用事件处理器的一个方法,事件处理器由程序员定义,以此来决定如何对数据进行操作。
要想获取指定书的属性,应该定义一个计数器,拿到书后再获取属性信息
即使标签没有属性,也会传递一个进来,判断应该使用getLength==0 ,不能使用==null;
步骤://1.获取解析器工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.获取解析器
SAXParser parser = factory.newSAXParser();
//3.获取读取器
XMLReader reader = parser.getXMLReader();
//4.注册事件处理器 可以实现ContentHandler接口或者继承DefaultHandler类的方法完成
reader.setContentHandler(new myContentHandler());
//5.解析文档
reader.parse("book.xml");
案例:将读取到的内容存储到集合中
public class write2List {
@Test
public void test() throws Exception{
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = parser.getXMLReader();
//注册事件处理器
myContentHandler1 handler = new myContentHandler1();
reader.setContentHandler(handler);
//解析文档
reader.parse("book.xml");
List bookList = handler.getBookList();
System.out.println(bookList.size());
}
}
class myContentHandler1 extends DefaultHandler{
Book book = null;
List list = new ArrayList();
String eleName = "";
@Override
public void startElement(String uri, String localName, String qName,
Attributes attr) throws SAXException {
if("书".equals(qName)){
book = new Book();
list.add(book);
if(attr.getValue("出版社")!=null){
String value = attr.getValue("出版社");
book.setPublish(value);
}
}
if("书名".equals(qName)){
eleName = "书名";
}
if("作者".equals(qName)){
eleName = "作者";
}
if("售价".equals(qName)){
eleName = "售价";
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(eleName)){
String name = new String(ch,start,length);
book.setBookName(name);
}
if("作者".equals(eleName)){
String author = new String(ch,start,length);
book.setBookName(author);
}
if("售价".equals(eleName)){
String price = new String(ch,start,length);
book.setBookName(price);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
eleName = "";
}
public List getBookList(){
return list;
}
}
5.使用dom4j对xml进行解析
步骤://1.创建解析器
SAXReader reader = new SAXReader();
//2.解析文档
Document dom = reader.read(new File("book.xml"));
//3.获取根节点
Element root = (Element) dom.getRootElement();
5.1 获取第一本书的书名
//4.获取第一本书的书名
Element bookName = root.element("书").element("书名");
// String name = bookName.getName();
String name = bookName.getText();
System.out.println(name);
5.2 增加元素
//4.创建节点 特价 并设置标签体
Element price2Ele = DocumentHelper.createElement("特价");
price2Ele.setText("78.00元");
//5.获取插入标签的 父标签
Element bookEle = root.element("书");
//6.挂载
bookEle.add(price2Ele);
//7.更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
5.3 删除元素
//4.获取其父节点
Element price2Ele = root.element("书").element("特价");
Element parent = price2Ele.getParent();
//5.删除元素
parent.remove(price2Ele);
//6.更新xml
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"));
writer.write(dom);
5.4 修改元素
//4.获取索要修改的元素
Element price2Ele = root.element("书").element("特价");
// price2Ele.setName("你好a");
price2Ele.setText("10000.00元");
//5.更新xml
OutputFormat format = OutputFormat.createPrettyPrint();
// format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileWriter("book.xml"));
writer.write(dom);
writer.close();
5.5 获取属性
//获取第二本书的属性
List list = root.elements();
//拿到第二本书元素
Element book2Ele = (Element) list.get(1);
//获取属性
Attribute attr = book2Ele.attribute("出版社");
//拿到属性值
String value = attr.getText();
System.out.println(value);
5.6 修改属性
将第二本书的属性 修改为 china出版社
//获取属性
Attribute attr = book2Ele.attribute("出版社");
//修改属性
attr.setText("china 出版设");
//更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
5.7 添加属性
//给第一本书添加出版社属性
//自定义属性,设置内容
Attribute attr = DocumentHelper.createAttribute(book1Ele, "出版社", "我家出版社");
book1Ele.add(attr);
//更新XML
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),format);
writer.write(dom);
writer.close();
5.8 删除属性
// 删除第一本书的出版社属性
Element book1Ele = root.element("书");
// 获取属性
Attribute attr = book1Ele.attribute("出版社");
// 删除属性
book1Ele.remove(attr);
// 更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
XML Schema
1.也是定义和描述xml文档结构和内容的模式语言,出现是为了克服DTD的局限性。
2.优势:
a.符合xml语法结构
b.内容能被dom sax等api解析
c.对名称空间支持的非常好
d.比DTD支持更多的数据类型,支持用户自定义新的数据类型
e.约束能力非常强大,可以对xml实例文档做出细致的语义限制
f.更加复杂,已经是w3c的标准,正逐步取代DTDs
3.本身是一个xml文件,扩展名为.xsd
一个Schema文档成为模式文档,遵循他写的是实例文档
必须有一个根节点--Schema
xml
xml和Html关系密切
XML与操作系统、编程语言的开发平台无关
实现不同系统之间的数据交换
作用:
数据交互
配置应用程序和网站
Ajax基石 (异步交互)
xml可以用浏览器打开
语法:
属性值用双引号包裹
一个元素可以有多个属性
属性值中不能直接包含<、“、&(不建议:‘、>)
嵌套错误
<title><name>XML编程</title></name>
myeclipse 格式化
Ctril+Shift+F
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格
特殊字符:
< <
> >
很多个特殊字符:
<![CDATA[特殊字符]]>
xml约束:
命名空间
重点:
解析XML
DOM解析:
基于xml文档树的解析
SAX解析:
基于事件的解析
DOM4j解析:
开源,优异
a.DOM解析 (javascript DOM模型)
XML编程
1.xml编程的两种解析方式
1.1 dom解析
优点:一次加载,多次使用。可以方便的对xml文档进行增删改查
缺点:如果xml文档过大的话,加载的时候会比较占用内存空间比较大,消耗资源,时间长。
1.2 sax解析
优点:一行行读取加载,占用空间少,消耗内存资源少,时间短。
缺点:如果下次使用还得重新加载,只适合查询操作,不适合增删改。
针对加载一次使用一次的问题,可以采取针对性的措施,即在加载的时候可以保存在集合中进行存储。
2.xml解析开发工具包
2.1 jaxp sun公司推出的,集成在j2se中。
2.2 dom4j
3.使用jaxp对xml文档进行dom解析
步骤:1.获取解析器工厂对象
DocumentBuilderFactory newInstance
2.获取解析器
DocumentBuilder new DocumentBuilder
3.解析xml文档,获取Document对象
Document builder.parse();
4.1 查询节点名称
Element ele = dom.getElementByTagName("xxx").item(index);
String name = ele.getTextContent();
syso(name);
4.2 修改节点名称
Element bookEle = (Element) dom.getElementsByTagName("书名").item(0);
bookEle.setTextContent("你懂得");
//更新xml
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new FileWriter("book.xml")));
4.3 添加节点
//添加自定义节点 ,设置标签体
Element price2 = dom.createElement("特价");
price2.setTextContent("99.00元");
//获取父节点
Element parent = (Element) dom.getElementsByTagName("书").item(0);
//将自定义节点挂载到父节点
parent.appendChild(price2);
//更新xml
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(new DOMSource(dom), new StreamResult(new FileWriter("book.xml")));
4.4 删除节点
//获取要删除的节点名称
Element price2Ele = (Element) dom.getElementsByTagName("特价").item(0);
//获取父节点
Element parent = (Element) price2Ele.getParentNode();
parent.removeChild(price2Ele);
//更新xml
4.5 在指定位置增加节点
//创建节点,并设置标签体
Element price2Ele = dom.createElement("特价啦");
price2Ele.setTextContent("100000.99元");
//获取指定位置的节点
Element ele = (Element) dom.getElementsByTagName("售价").item(0);
//获取指定位置父节点
Element parent = (Element) ele.getParentNode();
//增加节点
parent.insertBefore(price2Ele, ele);
4.6 获取属性
//获取所需修改属性所在的元素
Element ele = (Element) dom.getElementsByTagName("书").item(1);
//获取属性
System.out.println(ele.getAttribute("出版社"));
4.7 修改属性
//获取所需修改属性所在的元素
` Element ele = (Element) dom.getElementsByTagName("书").item(1);
//设置属性
ele.setAttribute("出版社", "大中国出版社");
//更新xml
4.8 添加属性
//获取所需修改属性所在的元素
` Element ele = (Element) dom.getElementsByTagName("书").item(1);
//设置属性
ele.setAttribute("出版社", "大中国出版社");
//更新xml
4.9 删除属性
//获取需要删除的属性所在的元素
Element ele = (Element) dom.getElementsByTagName("书").item(1);
//删除属性
ele.removeAttribute("书号");
//更新xml
4.10 遍历所有节点
public static void getAllNodes(Node node) {
// 判断如果是node,则打印标签名
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
//判断是否是Element或者Document类型,如果是则判断有没有孩子
if (node.getNodeType() == Node.ELEMENT_NODE
|| node.getNodeType() == node.DOCUMENT_NODE) {
// System.out.println(node.getNodeName());
//如果有孩子进行递归遍历
if (node.hasChildNodes()) {
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
getAllNodes(list.item(i));
}
}
}
//判断如果是标签体,则打印标签体的内容
if (node.getNodeType() == node.TEXT_NODE) {
System.out.println(node.getTextContent());
}
}
4.使用jaxp对xml文档进行sax解析
sax解析采用事件处理的方式来解析,涉及两个部分解析器和事件处理器。
sax解析器可以使用jaxp的api创建,创建完成后就可以去解析指定的xml文档了。
sax每当读取到xml文档的一部分,都会调用事件处理器的一个方法,事件处理器由程序员定义,以此来决定如何对数据进行操作。
要想获取指定书的属性,应该定义一个计数器,拿到书后再获取属性信息
即使标签没有属性,也会传递一个进来,判断应该使用getLength==0 ,不能使用==null;
步骤://1.获取解析器工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.获取解析器
SAXParser parser = factory.newSAXParser();
//3.获取读取器
XMLReader reader = parser.getXMLReader();
//4.注册事件处理器 可以实现ContentHandler接口或者继承DefaultHandler类的方法完成
reader.setContentHandler(new myContentHandler());
//5.解析文档
reader.parse("book.xml");
案例:将读取到的内容存储到集合中
public class write2List {
@Test
public void test() throws Exception{
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader reader = parser.getXMLReader();
//注册事件处理器
myContentHandler1 handler = new myContentHandler1();
reader.setContentHandler(handler);
//解析文档
reader.parse("book.xml");
List bookList = handler.getBookList();
System.out.println(bookList.size());
}
}
class myContentHandler1 extends DefaultHandler{
Book book = null;
List list = new ArrayList();
String eleName = "";
@Override
public void startElement(String uri, String localName, String qName,
Attributes attr) throws SAXException {
if("书".equals(qName)){
book = new Book();
list.add(book);
if(attr.getValue("出版社")!=null){
String value = attr.getValue("出版社");
book.setPublish(value);
}
}
if("书名".equals(qName)){
eleName = "书名";
}
if("作者".equals(qName)){
eleName = "作者";
}
if("售价".equals(qName)){
eleName = "售价";
}
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(eleName)){
String name = new String(ch,start,length);
book.setBookName(name);
}
if("作者".equals(eleName)){
String author = new String(ch,start,length);
book.setBookName(author);
}
if("售价".equals(eleName)){
String price = new String(ch,start,length);
book.setBookName(price);
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
eleName = "";
}
public List getBookList(){
return list;
}
}
5.使用dom4j对xml进行解析
步骤://1.创建解析器
SAXReader reader = new SAXReader();
//2.解析文档
Document dom = reader.read(new File("book.xml"));
//3.获取根节点
Element root = (Element) dom.getRootElement();
5.1 获取第一本书的书名
//4.获取第一本书的书名
Element bookName = root.element("书").element("书名");
// String name = bookName.getName();
String name = bookName.getText();
System.out.println(name);
5.2 增加元素
//4.创建节点 特价 并设置标签体
Element price2Ele = DocumentHelper.createElement("特价");
price2Ele.setText("78.00元");
//5.获取插入标签的 父标签
Element bookEle = root.element("书");
//6.挂载
bookEle.add(price2Ele);
//7.更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
5.3 删除元素
//4.获取其父节点
Element price2Ele = root.element("书").element("特价");
Element parent = price2Ele.getParent();
//5.删除元素
parent.remove(price2Ele);
//6.更新xml
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"));
writer.write(dom);
5.4 修改元素
//4.获取索要修改的元素
Element price2Ele = root.element("书").element("特价");
// price2Ele.setName("你好a");
price2Ele.setText("10000.00元");
//5.更新xml
OutputFormat format = OutputFormat.createPrettyPrint();
// format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileWriter("book.xml"));
writer.write(dom);
writer.close();
5.5 获取属性
//获取第二本书的属性
List list = root.elements();
//拿到第二本书元素
Element book2Ele = (Element) list.get(1);
//获取属性
Attribute attr = book2Ele.attribute("出版社");
//拿到属性值
String value = attr.getText();
System.out.println(value);
5.6 修改属性
将第二本书的属性 修改为 china出版社
//获取属性
Attribute attr = book2Ele.attribute("出版社");
//修改属性
attr.setText("china 出版设");
//更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
5.7 添加属性
//给第一本书添加出版社属性
//自定义属性,设置内容
Attribute attr = DocumentHelper.createAttribute(book1Ele, "出版社", "我家出版社");
book1Ele.add(attr);
//更新XML
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gb2312");
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),format);
writer.write(dom);
writer.close();
5.8 删除属性
// 删除第一本书的出版社属性
Element book1Ele = root.element("书");
// 获取属性
Attribute attr = book1Ele.attribute("出版社");
// 删除属性
book1Ele.remove(attr);
// 更新xml
FileWriter fw = new FileWriter("book.xml");
dom.write(fw);
fw.close();
XML Schema
1.也是定义和描述xml文档结构和内容的模式语言,出现是为了克服DTD的局限性。
2.优势:
a.符合xml语法结构
b.内容能被dom sax等api解析
c.对名称空间支持的非常好
d.比DTD支持更多的数据类型,支持用户自定义新的数据类型
e.约束能力非常强大,可以对xml实例文档做出细致的语义限制
f.更加复杂,已经是w3c的标准,正逐步取代DTDs
3.本身是一个xml文件,扩展名为.xsd
一个Schema文档成为模式文档,遵循他写的是实例文档
必须有一个根节点--Schema
阅读全文
0 0
- JAVA高级工程师课程笔记整理——(五)XML解析
- JAVA高级工程师课程笔记整理——(十三)Linux
- JAVA高级工程师课程笔记整理——(七)Mysql
- JAVA高级工程师课程笔记整理——(十)Servlet
- JAVA高级工程师课程笔记整理——(一)初识JAVA
- JAVA高级工程师课程笔记整理——(二)JAVA基础
- JAVA高级工程师课程笔记整理——(三)面向对象
- JAVA高级工程师课程笔记整理——(四)高级特性
- JAVA高级工程师课程笔记整理——(六)网页三剑客
- JAVA高级工程师课程笔记整理——(八)tomcat与九大内置对象
- JAVA高级工程师课程笔记整理——(九)JDBC与DBUtil
- JAVA高级工程师课程笔记整理——(十一)EL表达式与JSTL
- JAVA高级工程师课程笔记整理——(十二)jquery和ajax
- 面试总结——Java高级工程师(二)
- 面试总结——Java高级工程师(三)
- 面试总结——Java高级工程师(三)
- 面试总结——Java高级工程师(二)
- 面试总结——Java高级工程师(三)
- 移动端返回上一页,刚需!document.referrer 详解
- 单例模式singleton —— I
- NYOJ-7街区最短问题
- 利用pushState开发无刷页面切换
- [P1290]欧几里德的游戏
- JAVA高级工程师课程笔记整理——(五)XML解析
- SOAP webserivce 和 RESTful webservice 对比及区别
- html基本基础——图片元素&表单元素
- Hadoop Hive sql语法详解1-认识hive及DDL操作
- [P1082] 同余方程
- Eclipse中配置Python开发环境
- XML文件生成
- 计数排序(Counting Sort)与基数排序(Radix Sort)小结
- 1051. Pop Sequence (25)