javaweb入门20160305---xml的解析入门


package com.itheima.sax; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler; public class SaxDemo1 {
public static void main(String[] args) throws Exception {
//1.获取解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.通过工厂获取sax解析器
SAXParser parser = factory.newSAXParser();
//3.获取读取器
XMLReader reader = parser.getXMLReader();
//4.注册事件处理器
reader.setContentHandler(new MyContentHandler2() );
//5.解析xml
reader.parse("book.xml"); }
} //适配器设计模式
class MyContentHandler2 extends DefaultHandler{
private String eleName = null;
private int count = 0;
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
this.eleName = name;
} @Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("书名".equals(eleName) && ++count==2){
System.out.println(new String(ch,start,length));
}
} @Override
public void endElement(String uri, String localName, String name)
throws SAXException {
eleName = null;
} } class MyContentHandler implements ContentHandler{ public void startDocument() throws SAXException {
System.out.println("文档解析开始了.......");
} public void startElement(String uri, String localName, String name,
Attributes atts) throws SAXException {
System.out.println("发现了开始标签,"+name);
} public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println(new String(ch,start,length));
} public void endElement(String uri, String localName, String name)
throws SAXException {
System.out.println("发现结束标签,"+name);
} public void endDocument() throws SAXException {
System.out.println("文档解析结束了.......");
} public void endPrefixMapping(String prefix) throws SAXException {
// TODO Auto-generated method stub } public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub } public void processingInstruction(String target, String data)
throws SAXException {
// TODO Auto-generated method stub } public void setDocumentLocator(Locator locator) {
// TODO Auto-generated method stub } public void skippedEntity(String name) throws SAXException {
// TODO Auto-generated method stub } public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// TODO Auto-generated method stub } }

Document document = reader.read(new File("input.xml"));
ele.addElement("age");
Attribute attr= ele.attribute("aaa");
ele.remove(attribute);
Document document = DocumentHelper.parseText(text);
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(node);
writer.close();
XMLWriter writer =
你所应该知道的Dom4J
创建解析器:
SAXReader reader = new SAXReader();
利用解析器读入xml文档:
Document document = reader.read(new File("input.xml"));
获取文档的根节点:
Element root = document.getRootElement();
接口继承结构:
Node ---
Branch
--Document
--Element
----
Attribute
Node接口
asXML() 将一个节点转换为字符串 |
|
getName() 获取节点的名称,如果是元素则获取到元素名,如果是属性获取到属性名 |
|
short |
getNodeType() 获取节点类型,在Node接口上定义了一些静态short类型的常量用来表示各种类型 |
getParent() 获取父节点,如果是根元素调用则返回null,如果是其他元素调用则返回父元素,如果是属性调用则返回属性所依附的元素。 |
|
getText() 返回节点文本,如果是元素则返回标签体,如果是属性则返回属性值 |
|
selectNodes(String xpathExpression) 利用xpath表达式,选择节点 |
|
void |
setName(String name) 设置节点的名称,元素可以更改名称,属性则不可以,会抛出UnsupportedOperationException 异常 |
void |
setText(String text) 设置节点内容,如果是元素则设置标签体,如果是属性则设置属性的值 |
void |
write(Writer writer) 将节点写出到一个输出流中,元素、属性均支持 |
Branch接口(实现了Node接口)
void |
add(Element element) 增加一个子节点 |
addElement(QName qname) 增加一个给定名字的子节点,并且返回这个新创建的节点的引用 |
|
int |
indexOf(Node node) 获取给定节点在所有直接点中的位置号,如果该节点不是此分支的子节点,则返回-1 |
boolean |
remove(Element element) 删除给定子元素,返回布尔值表明是否删除成功。 |
void |
add(Attribute attribute) 增加一个属性 |
addAttribute(QName qName, String value) 为元素增加属性,用给定的属性名和属性值,并返回该元素 |
|
addAttribute(String name, String value) 为元素增加属性 |
|
attribute(int index) 获取指定位置的属性 |
|
attribute(QName qName) 获取指定名称的属性 |
|
attributeIterator() 获取属性迭代器 |
|
attributes() 获取该元素的所有属性,以一个list返回 |
|
attributeValue(QName qName) 获取指定名称属性的值,如果不存在该属性返回null,如果存在该属性但是属性值为空,则返回空字符串 |
|
element(QName qName) 获取指定名称的子元素,如果有多个该名称的子元素,则返回第一个 |
|
element(String name) 获取指定名称的子元素,如果有多个该名称的子元素,则返回第一个 |
|
elementIterator() 获取子元素迭代器 |
|
elementIterator(QName qName) 获取指定名称的子元素的迭代器 |
|
elements() 获取所有子元素,并用一个list返回 |
|
elements(QName qName) 获取所有指定名称的子元素,并用一个list返回 |
|
getText() 获取元素标签体 |
|
boolean |
remove(Attribute attribute) 移除元素上的属性 |
void |
setAttributes(List attributes) 将list中的所有属性设置到该元素上 |
Attribute接口(实现了Node接口)
getQName() 获取属性名称 |
|
getValue() 获取属性的值 |
|
void |
setValue(String value) 设置属性的值 |
DocumentHelper 类
static Attribute |
createAttribute(Element owner, QName qname, String value) 创建一个Attribute |
|
static Document |
创建一个Document |
|
static Document |
createDocument(Element rootElement) 以给定元素作为根元素创建Document |
|
static Element |
createElement(QName qname) 以给定名称创建一个Element |
|
static Document |
parseText(String text) 将一段字符串转化为Document |
将节点写出到XML文件中去
方法1:
调用Node提供的write(Writer writer) 方法,使用默认方式将节点输出到流中:
node.write(new FileWriter("book.xml"));
乱码问题:
Dom4j在将文档载入内存时使用的是文档声明中encoding属性声明的编码集进行编码, 如果在此时使用writer输出时writer使用的内部编码集与encoding不同则会有乱码问题。
FileWriter默认使用操作系统本地码表即gb2312编码,并且无法更改。
此时可以使用OutputStreamWriter(FileOutputStream("filePath"),"utf-8");的方式自己封装 一个指定码表的Writer使用,从而解决乱码问题。
方式2:
利用XMLWriter写出Node:
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(node);
writer.close();
乱码问题:
(1)使用这种方式输出时,XMLWriter首先会将内存中的docuemnt翻译成UTF-8 格式的document,在进行输出,这时有可能出现乱码问题。
可以使用OutputFormat 指定XMLWriter转换的编码为其他编码。
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
(2)Writer使用的编码集与文档载入内存时使用的编码集不同导致乱码,使用字节流 或自己封装指定编码的字符流即可(参照方法1)。
package com.itheima.dom4j; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Dom4jDemo1 {
public static void main(String[] args) throws Exception {
//1.获取解析器
SAXReader reader = new SAXReader();
//2.解析xml获取代表整个文档的dom对象
Document dom = reader.read("book.xml");
//3.获取根节点
Element root = dom.getRootElement();
//4.获取书名进行打印
String bookName = root.element("书").element("书名").getText();
System.out.println(bookName);
}
}
package com.itheima.dom4j; import java.io.FileOutputStream;
import java.util.List; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test; public class Demo4jDemo2 {
@Test
public void attr() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement(); Element bookEle = root.element("书");
//bookEle.addAttribute("出版社", "传智出版社");
// String str = bookEle.attributeValue("出版社");
// System.out.println(str);
Attribute attr = bookEle.attribute("出版社");
attr.getParent().remove(attr); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
} @Test
public void del() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement(); Element price2Ele = root.element("书").element("特价");
price2Ele.getParent().remove(price2Ele); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
} @Test
public void update()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement(); root.element("书").element("特价").setText("4.0元"); XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
} @Test
public void add()throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement();
//凭空创建<特价>节点,设置标签体
Element price2Ele = DocumentHelper.createElement("特价");
price2Ele.setText("40.0元");
//获取父标签<书>将特价节点挂载上去
Element bookEle = root.element("书");
bookEle.add(price2Ele); //将内存中的dom树会写到xml文件中,从而使xml中的数据进行更新
// FileWriter writer = new FileWriter("book.xml");
// dom.write(writer);
// writer.flush();
// writer.close();
XMLWriter writer = new XMLWriter(new FileOutputStream("book.xml"),OutputFormat.createPrettyPrint());
writer.write(dom);
writer.close();
} @Test
public void find() throws Exception{
SAXReader reader = new SAXReader();
Document dom = reader.read("book.xml");
Element root = dom.getRootElement(); List<Element> list = root.elements();
Element book2Ele = list.get(1);
System.out.println(book2Ele.element("书名").getText()); }
}
javaweb入门20160305---xml的解析入门的更多相关文章
- JavaWeb学习日记----XML的解析
XML的解析简介: 在学习JavaScript时,我们用的DOM来解析HEML文档,根据HTML的层级结构在内存中分配一个树形结构,把HTML的标签啊,属性啊和文本之类的都封装成对象. 比如:docu ...
- Javaweb入门20160301 ---xml入门
一.xml语法 1.文档声明 用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml 通常一个xml都要包含并且只能包含一个文档声明 xml的文档必须在整个xml的最前面,在文档声明之前不能有 ...
- OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据
OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...
- 【网络爬虫入门03】爬虫解析利器beautifulSoup模块的基本应用
[网络爬虫入门03]爬虫解析利器beautifulSoup模块的基本应用 1.引言 网络爬虫最终的目的就是过滤选取网络信息,因此最重要的就是解析器了,其性能的优劣直接决定这网络爬虫的速度和效率.B ...
- SpringBoot快速入门(解析+入门案例源码实现)
这里写目录标题 SpringBoot入门 一.SpringBoot 概念 二.JavaConfig 入门 1. JavaConfig 概念 2. 项目准备 三.常用注解 四.SpringBoot 入门 ...
- JavaWeb学习笔记——XML解析
DOM解析操作 只在跟节点<addresslist>下面建立一个子节点<name> <?xml version="1.0" encoding=&quo ...
- Linux入门:运行级别解析
Linux入门:运行级别解析 一.查看当前运行级别 Ubuntu中,runlevel命令 可以查看当前运行级别: CentOS中,who -r 命令查看当前运行级别: www.2cto.com ...
- Maven入门2-pom.xml文件与settings.xml文件
Maven入门2-pom.xml文件与settings.xml文件 本文内容来源于官网文档部分章节,settings.xml文件:参考http://maven.apache.org/settings. ...
- Spring 入门 web.xml配置详解
Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...
- 用java实现一个简易编译器1-词法解析入门
本文对应代码下载地址为: http://download.csdn.net/detail/tyler_download/9435103 视频地址: http://v.youku.com/v_show/ ...
随机推荐
- EF架构随心所欲打造属于你自己的DbModel【转】
前言 我们都知道EF可以生成Dbmodel,系统生成的Model有时候并不是我们想要的,如何我们要生成自己的Model,那么久需要我们手动的去修改T4模版,T4是对“Text Template Tra ...
- Windows平台网站图片服务器架构的演进[转]
构建在Windows平台之上的网站,往往会被业内众多架构师认为很“保守”.很大部分原因,是由于微软技术体系的封闭和部分技术人员的短视造成 的.由于长期缺乏开源支持,所以只能“闭门造车”,这样很容易形成 ...
- Asm Shader Reference --- Shader Model 3.0 part
ps部分 概览 Instruction Set Name Description Instruction slots S ...
- POJ 1904 King's Quest 强联通分量+输入输出外挂
题意:国王有n个儿子,现在这n个儿子要在n个女孩里选择自己喜欢的,有的儿子可能喜欢多个,最后国王的向导给出他一个匹配.匹配有n个数,代表某个儿子和哪个女孩可以结婚.已知这些条件,要你找出每个儿子可以和 ...
- Linux中_ALIGN宏背后的原理——内存对齐
转载自: http://englishman2008.blog.163.com/blog/static/2801290720114210254690/ 1. 原理 int a; int ...
- 教程-FastReport 的安装 心得
由于要使用报表,所以下载了FastReport 4.7.91,由于是第一次安装和使用FastReport报表,所以在安装的时候走了点弯路.把心得写一下吧. 我是第安装第二遍才完全理解安装过程,也可以定 ...
- 8-15-Exercise
8-15-小练 这次的题目......只觉得泪奔啊......T T A.HDU 1042 N! 因为0<=n<=1000,故一定要用数组或字符串[同样因为n<=1000故用数组 ...
- Android模拟器如何加载本机地址及访问本机服务器
首先获取本机ip地址: 在cmd 命令窗口中输入 ipconfig 查看本地电脑ip地址如下: 获取服务器上的Json数据,并返回结果,部分代码如下: 注:StreamUtils是自定义的一个工具类, ...
- C#中只使用Invokerequired来判断是不是UI线程可靠吗?
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:C#中只使用Invokerequired来判断是不是UI线程可靠吗?.
- Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
# 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...