1.DOM解析:基于DOM模型解析xml文件。一次性把xml文件加载进内存,然后在内存中构建Document树。比较消耗内存,并不适合读取容量大的xml文件。
1)DOM解析的原理:
xml解析引擎把一个xml文件一次性加载进内存,在内存中创建一颗document对象树。通过树上的对象获取或设置xml文件信息
2)基于dom解析原理工具
dom4j工具
3)dom4j使用方法(具体代码请另行百度)
查:
Document doc= new SAXReader().read("xml文件");
标签:
element("name") 查询第一个子标签
elements("name") 查询指定名称的所有子标签
elements() 查询所有子标签
属性:
attributeValue("name") 根据属性名获取属性值
attribute("name") 根据属性名获取属性对象
getName() 属性名 / getValue() 属性值
文本:
getText() 获取当前标签的文本内容
elementText("name") 获取子标签文本
增:
文档: DocumentHelper.createDocumnt();
标签: addElement("name")
属性: addAttribute("name","value")
改:
属性值: setValue("修改值") / addAttribute("同名属性","修改值")
文本: setText("文本")
删:
标签、属性: detach() / getParent().remove(标签/属性)
4) XPath
XPath表达式(重点)(具体参见w3c)
/ 绝对路径 斜杠在最前面,代表xml文件的根。斜杠在中间,表示子元素。
// 相对路径 选择后代元素(不分层次结构)
* 通配 选择所有元素
[ ] 条件 选择什么条件下的元素。例如 /AAA/BBB[1] 选择第一个BBB子元素
@ 属性 选取属性
= 内容 (值)
and 逻辑与
text() 选取文本内容
XPath在dom4j中如何使用
1)在项目中导入xpath支持jar包。jaxen-1.1-beta-6.jar
2)使用dom4j提供的xpath方法
selectNodes(xpath表达式): 查询符合条件的多个节点对象
selectSingleNode(xpath表达式) 查询符合条件的一个节点对象
2.SAX解析:基于SAX的原理解析xml文件。优势:内存占用非常小。加载一点,解析一点,处理一点,接着释放内存。
oracle-sun官方的API, 在jdk中,属于javase的规范。org.xml.sax.* 。并不需要导入包。
基于SAX解析读取xml文件
public class Demo1 {
public static void main(String[] args)throws Exception {
//1.创建SAXParser对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
//2.调用parse方法,读取和解析xml文件
/**
* 参数一: 指定的文件地址
*/
File file = new File("./src/contact.xml");
/**
* 参数二: 指定DefaultHandler的子类
*/
parser.parse(file, new MyDefaultHandler());
}
}
//事件处理程序:
package gz.itcast.b_sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 事件处理程序
* @author APPle
*/
public class MyDefaultHandler extends DefaultHandler {
/**
* 遇到文档开始
*/
@Override
public void startDocument() throws SAXException {
System.out.println("文档开始读取");
}
/**
* 遇到开始标签
* @param qName: 当前遇到的标签名称
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
}
/**
* 遇到文本内容(包括空格换行)
* @param ch : 表示整个xml文档所有文本内容
* @param start: 表示当前读到的文本内容的开始位置
* @param length: 表示当前读到的文本内容的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//得到当前读到的文本内容
String content = new String(ch,start,length);
System.out.println("MyDefaultHandler.characters()-->"+content);
}
/**
* 遇到结束标签
* @param qName: 表示当前读取的结束标签名称
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("MyDefaultHandler.endElement()-->"+qName);
}
/**
* 遇到结束文档时
*/
@Override
public void endDocument() throws SAXException {
System.out.println("文档读取完毕");
}
}
1)DOM解析的原理:
xml解析引擎把一个xml文件一次性加载进内存,在内存中创建一颗document对象树。通过树上的对象获取或设置xml文件信息
2)基于dom解析原理工具
dom4j工具
3)dom4j使用方法(具体代码请另行百度)
查:
Document doc= new SAXReader().read("xml文件");
标签:
element("name") 查询第一个子标签
elements("name") 查询指定名称的所有子标签
elements() 查询所有子标签
属性:
attributeValue("name") 根据属性名获取属性值
attribute("name") 根据属性名获取属性对象
getName() 属性名 / getValue() 属性值
文本:
getText() 获取当前标签的文本内容
elementText("name") 获取子标签文本
增:
文档: DocumentHelper.createDocumnt();
标签: addElement("name")
属性: addAttribute("name","value")
改:
属性值: setValue("修改值") / addAttribute("同名属性","修改值")
文本: setText("文本")
删:
标签、属性: detach() / getParent().remove(标签/属性)
4) XPath
XPath表达式(重点)(具体参见w3c)
/ 绝对路径 斜杠在最前面,代表xml文件的根。斜杠在中间,表示子元素。
// 相对路径 选择后代元素(不分层次结构)
* 通配 选择所有元素
[ ] 条件 选择什么条件下的元素。例如 /AAA/BBB[1] 选择第一个BBB子元素
@ 属性 选取属性
= 内容 (值)
and 逻辑与
text() 选取文本内容
XPath在dom4j中如何使用
1)在项目中导入xpath支持jar包。jaxen-1.1-beta-6.jar
2)使用dom4j提供的xpath方法
selectNodes(xpath表达式): 查询符合条件的多个节点对象
selectSingleNode(xpath表达式) 查询符合条件的一个节点对象
2.SAX解析:基于SAX的原理解析xml文件。优势:内存占用非常小。加载一点,解析一点,处理一点,接着释放内存。
oracle-sun官方的API, 在jdk中,属于javase的规范。org.xml.sax.* 。并不需要导入包。
基于SAX解析读取xml文件
public class Demo1 {
public static void main(String[] args)throws Exception {
//1.创建SAXParser对象
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
//2.调用parse方法,读取和解析xml文件
/**
* 参数一: 指定的文件地址
*/
File file = new File("./src/contact.xml");
/**
* 参数二: 指定DefaultHandler的子类
*/
parser.parse(file, new MyDefaultHandler());
}
}
//事件处理程序:
package gz.itcast.b_sax;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 事件处理程序
* @author APPle
*/
public class MyDefaultHandler extends DefaultHandler {
/**
* 遇到文档开始
*/
@Override
public void startDocument() throws SAXException {
System.out.println("文档开始读取");
}
/**
* 遇到开始标签
* @param qName: 当前遇到的标签名称
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("MyDefaultHandler.startElement()-->"+qName);
}
/**
* 遇到文本内容(包括空格换行)
* @param ch : 表示整个xml文档所有文本内容
* @param start: 表示当前读到的文本内容的开始位置
* @param length: 表示当前读到的文本内容的长度
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
//得到当前读到的文本内容
String content = new String(ch,start,length);
System.out.println("MyDefaultHandler.characters()-->"+content);
}
/**
* 遇到结束标签
* @param qName: 表示当前读取的结束标签名称
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("MyDefaultHandler.endElement()-->"+qName);
}
/**
* 遇到结束文档时
*/
@Override
public void endDocument() throws SAXException {
System.out.println("文档读取完毕");
}
}