Dom4j工具,是非官方的,不在jdk中。
使用步骤:
1)导入dom4j的核心包。 dom4j-1.6.1.jar
2)编写Dom4j读取xml文件的代码
animals.xml
<?xml version="1.0" encoding="UTF-8"?> <Animals> <Cat id="c001" name="喵喵"> <Home>火星</Home> <BornDate>2010-01-01</BornDate> </Cat> <Cat id="c002" name="咪咪"> <Home>冥王星</Home> <BornDate>2012-09-01</BornDate> </Cat> <Cat id="c003" name="Tom"> <Home>地球</Home> <BornDate>2011-12-23</BornDate> </Cat> <Dog id="d001" name="旺财"> <Home>木星</Home> <BornDate>2007-10-16</BornDate> </Dog> <Dog id="d002" name="汪汪"> <Home>金星</Home> <BornDate>2008-05-12</BornDate> </Dog> </Animals>
package com.rk.xml.f_dom4j_read; import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; /** * 第一个Dom4j读取xml文档的例子 * 获得Document对象 * @author RK */ public class Demo01 { public static void main(String[] args) { try { //1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); //2.读取xml文档,返回Document对象 Document doc = reader.read(new File("./src/animals.xml")); System.out.println(doc); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
package com.rk.xml.f_dom4j_read; import java.util.List; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.Attribute; import org.dom4j.io.SAXReader; import org.junit.Test; /** * 第二个dom4j读取xml文件内容 * 节点 * 标签 * 属性 * 文本 * @author RK * */ public class Demo02 { /** * 获取节点 * 1、通过Document文档获得根元素Document.getRootElement() * 2、获得标签元素下的所有子节点 Branch.nodeIterator() * 3、获得节点的名字、类型:Node.getName(), Node.getNodeType(), Node.getNodeTypeName() */ @Test public void testNode() { try { //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/products.xml")); //2、得到根标签 Element rootElement = doc.getRootElement(); //3、遍历文档的所有节点 getChildNodes(rootElement); } catch (DocumentException e) { e.printStackTrace(); } } private void getChildNodes(Element elem) { //nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点) @SuppressWarnings("unchecked") Iterator<Node> it = elem.nodeIterator(); while(it.hasNext()) { Node node = it.next(); System.out.println(node.getName() + "===" + node.getNodeType() + "===" + node.getNodeTypeName()); //判断是否是标签元素 if(node instanceof Element) { getChildNodes((Element)node); } } } /** * 获取标签 * 1、获取特定的一个标签 Element.element(String name) : 得到当前标签下指定名称的第一个子标签 * 2、获取所有的子标签 Element.elementIterator(String name): 得到当前标签下指定名称的所有子标签 */ @Test public void testElement() throws Exception { //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/animals.xml")); //2.得到根标签 System.out.println("===================================2"); Element rootElement = doc.getRootElement(); //获得节点相关信息 String name = rootElement.getName();//得到节点名称 short type = rootElement.getNodeType();//得到节点类型 String typeName = rootElement.getNodeTypeName();//得到节点类型名称 System.out.println(name + "\t" + type + "\t" + typeName); //3.得到当前标签下指定名称的第一个子标签 System.out.println("===================================3"); Element productElement = rootElement.element("Dog"); System.out.println(productElement.getName()); //4.得到当前标签下指定名称的所有子标签 System.out.println("===================================4"); @SuppressWarnings("unchecked") Iterator<Element> it = rootElement.elementIterator("Cat"); while(it.hasNext()) { Element elem = it.next(); System.out.println(elem.getName()); } //5.得到当前标签下的的所有子标签 System.out.println("===================================5"); @SuppressWarnings("unchecked") List<Element> list = rootElement.elements(); //遍历List的方法 //1)传统for循环 2)增强for循环 3)迭代器 // for(int i=0;i<list.size();i++) // { // System.out.println(list.get(i).getName()); // } // for(Element elem : list) // { // System.out.println(elem.getName()); // } Iterator<Element> iterator = list.iterator(); while(iterator.hasNext()) { Element elem = iterator.next(); System.out.println(elem.getName()); } //6、获取更深层次的标签(方法只能一层层地获取) System.out.println("===================================6"); Element nameElement = rootElement.element("Dog").element("Home"); System.out.println(nameElement.getName()); System.out.println(nameElement.getText()); System.out.println(nameElement.getPath()); System.out.println(nameElement.getUniquePath()); } /** * 获取属性 * 1、获取特定的一个属性 * 2、获取标签元素下的所有属性 */ @Test public void testAttribute() throws Exception { //读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/animals.xml")); Element rootElement = doc.getRootElement(); //获取属性:(先获的属性所在的标签对象,然后才能获取属性) //1.得到标签对象 Element dogElement = rootElement.element("Dog"); //2.得到属性 //2.1 得到指定名称的属性值 System.out.println("===================================2.1"); String idValue = dogElement.attributeValue("id"); System.out.println(idValue); //2.2 得到指定属性名称的属性对象 System.out.println("===================================2.2"); Attribute idAttr = dogElement.attribute("name"); //getName: 属性名称 getValue:属性值 System.out.println(idAttr.getName() + "=" + idAttr.getValue()); //2.3 得到所有属性对象,返回List集合 System.out.println("===================================2.3"); @SuppressWarnings("unchecked") List<Attribute> list = dogElement.attributes(); //遍历属性 for(Attribute attr : list) { System.out.println(attr.getName() + "=" + attr.getValue()); } //2.4 得到所有属性对象,返回迭代器 System.out.println("===================================2.4"); @SuppressWarnings("unchecked") Iterator<Attribute> iterator = rootElement.element("Cat").attributeIterator(); while(iterator.hasNext()) { Attribute attr = iterator.next(); System.out.println(attr.getName() + "=" + attr.getValue()); } } /** * 获取文本 * 1、获取当前标签元素的文本Element.getText() * 2、获取子标签元素的文本Element.elementText(String name) */ @Test public void testText() throws Exception { //读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/animals.xml")); Element rootElement = doc.getRootElement(); //注意: 空格和换行也是xml的内容 String content = rootElement.getText(); System.out.println("==Start==" + content + "==End=="); //获取文本(先获取标签,再获取标签上的文本) Element bornDateElement = rootElement.element("Cat").element("BornDate"); //1. 得到文本 String text = bornDateElement.getText(); System.out.println(bornDateElement.getName() + "元素的文本是" + text); //2. 得到指定子标签名的文本内容 String text2 = rootElement.element("Dog").elementText("Home"); System.out.println(text2); } }
package com.rk.xml.f_dom4j_read; import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Node; import org.dom4j.Element; import org.dom4j.Attribute; import org.dom4j.io.SAXReader; /** * 练习-完整读取xml文档内容 * @author RK * */ public class Demo03 { public static void main(String[] args) throws Exception { //读取xml文档 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/animals.xml")); //读取根标签 Element rootElement = doc.getRootElement(); StringBuilder sb = new StringBuilder(); getChildNodes(rootElement,sb); System.out.println(sb.toString()); } /** * 获取当前标签的所有子节点 */ private static void getChildNodes(Element currentElement, StringBuilder sb) { String name = currentElement.getName(); //开始标签Start sb.append("<"+name); //得到标签的属性列表 @SuppressWarnings("unchecked") Iterator<Attribute> iterator = currentElement.attributeIterator(); while(iterator.hasNext()) { Attribute attr = iterator.next(); String attrName = attr.getName(); String attrValue = attr.getValue(); sb.append(" " + attrName + "=\"" + attrValue + "\""); } //开始标签End sb.append(">"); //获取子节点 @SuppressWarnings("unchecked") Iterator<Node> it = currentElement.nodeIterator(); while(it.hasNext()) { Node node = it.next(); short type = node.getNodeType(); if(type == Node.ELEMENT_NODE) { getChildNodes((Element)node, sb); } else if(type == Node.TEXT_NODE) { sb.append(node.getText()); } else { //其它情况,不做处理 } } //结束标签 sb.append("</" + name + ">"); } }