使用dom4j解析xml
- dom4j是一个组织,针对xml解析,提供了解析器dom4j
- 导入dom4j的jar包
- 创建一个文件夹lib
- 把jar包复制到lib下
- 右键点击jar包,选择添加到path
- 看到jar包变成奶瓶的形状就可以了
常用的类:
- SAXReader类
- 使用这个 类创建一个解析器
- new SAXReader()
- Document read(String systemId) 使用这个方法,创建document对象
- Document类
- Element getRootElement() 使用这个方法获得根节点,返回值是一个Element对象
- Element类
- List elements() 方法获得所有的 子元素的集合
实例:查询根节点的所有的 子节点,打印出名称
import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class Demo_dom4j { public static void main(String[] args) throws Exception { // 创建一个解析器 SAXReader reader = new SAXReader(); // 获得document对象 Document read = reader.read("src\\haha.xml"); // 获得根节点 Element rootElement = read.getRootElement(); // 获得根节点 下一层的所有元素,只能遍历一层 List<Element> elements = rootElement.elements(); // 遍历字元素 for (Element element : elements) { String name = element.getName(); System.out.println(name); } } }
- SAXReader类
实例:在指定的元素下添加一个元素,
- 回写操作
实例:修改文本中的一个元素的内容
- 创建解析器
- 获得dom对象
- 找到要操作的节点
- 修改内容
- 回写
- 实例:删除指定的节点
- 创建解析器
- 获得dom对象
- 找到要删除的节点
- 找到他的父节点
- 使用remove方法删除
- 回写操作,写入文件
- 实例:获取属性值
- 创建解析器
- 获得dom对象
- 找到要操作的节点
- String attributeValue(String name)使用这个方法获得属性值,返回值是一个字符串类型的
使用dom4j支持的xpth操作
- 可以直接获取到某个元素
- 第一种形式/AAA/BBB/CCC 一层一层往下找
- 低二种形式//BBB 表示质押 和这个名称相同的 都找到
- 第三种形式/* 表示所有元素
- 第四种形式
- //BBB[1]表示第一个BBB元素4
- //BBB[last()]表示最后一个BBB元素
- 第五种形式
- //BBB[@id]表示找到有id属性的BBB元素
-第六种形式 - //BBB[@id=’bi’]表示找到有属性id属性值是bi的BBB元素
- //BBB[@id]表示找到有id属性的BBB元素
使用dom4j支持xpth具体操作
- 导入jar包,只是dom4j中的lib文件夹 内是包含 这个jar包的,但是一定要注意导入
- 在默认情况下dom4j不支持xpath
- 要想使用xpth首先需要引入jar包
- dom4j提供了两个方法用来 支持xpth
- selectNodes(String xpathExpression)获取多个节点
- selectSingleNode(String xpathExpression)获取一个节点
- 实例:使用xpth找出所有的name元素,打印出来
- 实例:使用dom4j支持的xpth,找到指定的元素
dom4j解析xml 使用sax方式
- 先要创建一个SAX解析工厂,
- 使用解析工厂创建一个解析器
- 使用解析器对象,获得一个读取器对象
- 给读取器设置一个处理器,参数是ContentHandler的一个实现类对象
- 执行parse 解析方法
==注意==
- 由于SAX方式,是一行一行的解析的 ,所以这种方式解析,系统会自动执行处理器内的 方法,不需要我们调用
- 实例:使用SAX方式,解析出来,所有的学生,并且进行封装
/**
* 使用dom4j的sax方式解析xml
* @author lien
* @throws SAXException
* @throws ParserConfigurationException
* @throws IOException
*
* */
@Test
public void test2() throws ParserConfigurationException, SAXException, IOException{
// 创建解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 使用工厂产生解析器
SAXParser parser = factory.newSAXParser();
// 使用解析器对象,得到一个读取器对象
XMLReader reader = parser.getXMLReader();
// 给读取器,设置个处理器
reader.setContentHandler(new ContentHandler() {
@Override
public void startPrefixMapping(String prefix, String uri)
throws SAXException {
// System.out.println("startPrefixMapping方法打印---" + prefix + uri);
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
nodeName = qName;//会将读取到每个节点的名字临时保存下来
if("student".equals(qName)){
p = new Person();//如果找到studnet节点那么开始读取内容,记性封装
}
System.out.println("startElement 方法打印---"+uri + localName + qName);
}
@Override
public void startDocument() throws SAXException {
// System.out.println("startDocument方法打印");
}
@Override
public void skippedEntity(String name) throws SAXException {
// System.out.println("skippedEntity方法打印" + name);
}
@Override
public void setDocumentLocator(Locator locator) {
// System.out.println("setDocumentLocator方法打印" + locator);
}
@Override
public void processingInstruction(String target, String data)
throws SAXException {
// System.out.println("processingInstruction方法打印---" + target + data);
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
// System.out.println("endPrefixMapping方法打印---"+prefix);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("student".equals(qName)){
nodeName = null;//如果结束标签读取到保存的节点,那么临时空间清空
// 同时将等装好的对象,加入到集合中
arrPerson.add(p);
}
System.out.println("endElement方法打印---"+uri + localName + qName);
}
@Override
public void endDocument() throws SAXException {
// System.out.println("endDocument()方法打印");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if("name".equals(nodeName)&&p.getName() == null){
p.setName(new String(ch,start,length));
}
if("age".equals(nodeName)&&p.getAge() == null){
p.setAge(new String(ch,start,length));
System.out.println("characters方法打印"+new String(ch,start,length));
}
if("sex".equals(nodeName) && p.getSex() == null){
p.setSex(new String(ch,start,length));
System.out.println("characters方法打印"+new String(ch,start,length));
}
}
@Override
public void ignorableWhitespace(char[] ch, int start, int length)
throws SAXException {
// System.out.println("ignorableWhitespqce方法打印--"+new String(ch,start,length));
}
});
reader.parse("a.xml");
// 打印集合
System.out.println(arrPerson);
}
- 结果:
[Person [name=张星星, age=18, sex=男], Person [name=杨杰, age=18, sex=男], Person [name=张星星, age=18, sex=男], Person [name=陈鹏鹏, age=18, sex=男], Person [name=小明, age=12, sex=男], Person [name=小明, age=12, sex=男], Person [name=小明, age=12, sex=男]]
“`