XML解析
xml文件除了给开发者看,更多的情况使用程序读取xml文件的内容。这叫做xml解析
XML解析方式(原理不同)
DOM解析
SAX解析
XML解析工具
DOM解析原理:
JAXP (oracle-Sun公司官方)
JDOM工具(非官方)
Dom4J工具(非官方)
三大框架(默认读取xml的工具就是Dom4j)
.......
SAX解析原理:
sax解析工具(oracle-sun公司官方)
什么是DOM解析
DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
Dom4j工具
非官方,不在jdk中。
使用步骤:
导入dom4j的核心包。 dom4j-1.6.1.jar
编写Dom4j读取xml文件代码
被读取文件
<?xml version="1.0" encoding="utf-8"?> <contactList> <contact id="001"> <name>张三</name> <age>20</age> <phone>134222223333</phone> <email>zhangsan@qq.com</email> <qq>432221111</qq> </contact> <contact id="002"> <name>lisi</name> <age>20</age> <phone>134222225555</phone> <email>lisi@qq.com</email> <qq>432222222</qq> </contact> </contactList>
//编写文件读取
import java.io.File; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Dom4j_read { public static void main(String[] args) { try { //1.创建一个xml解析器对象 SAXReader reader = new SAXReader(); //2.读取xml文档,返回Document对象 Document doc = reader.read(new File(".\src\contact.xml")); System.out.println(doc); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(); } } }
无法将所有标签读取,使用迭代和递归就可以
import java.io.File; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import org.junit.Test; public class Demo1 { /*@Test public void test1() throws Exception { SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点) Iterator<Node> it = doc.nodeIterator(); while(it.hasNext()) { Node node = it.next(); String name = node.getName(); System.out.println(name); //继续取出其下面的子节点 //只有标签节点才有子节点 //判断当前节点是否是标签节点 if(node instanceof Element) { Element elem = (Element)node; Iterator<Node> it1 = elem.nodeIterator(); while(it1.hasNext()) { Node node1 = it1.next(); System.out.println(node1.getName()); } } } }*/ @Test public void test2() throws Exception { SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); Element rootelem = doc.getRootElement(); getChildNode(rootelem); } private void getChildNode(Element elem) { System.out.println(elem.getName()); Iterator<Node> it = elem.nodeIterator(); while(it.hasNext()) { Node node = it.next(); if(node instanceof Element){ Element el = (Element)node; getChildNode(el); } } } }
Domj4读取xml文件
节点:Iterator Element.nodeIterator(); //获取当前标签节点下的所有子节点
标签:
Element Document.getRootElement(); //获取xml文档的根标签
Element ELement.element("标签名") //指定名称的第一个子标签
Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
List<Element> Element.elements(); //获取所有子标签
@Test//获取标签 public void text3() throws Exception { //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //2.得到根标签,得到标签名称 Element rootelem = doc.getRootElement(); String name = rootelem.getName(); System.out.println(name); //3.得到当前标签下指定名称的第一个子标签 /*Element contactelem = rootelem.element("contact"); System.out.println(contactelem.getName());*/ /*//4.得到当前标签下指定名称的所有子标签 Iterator<Element> it = rootelem.elementIterator("contact"); while(it.hasNext()){ Element elem = it.next(); System.out.println(elem.getName()); }*/ //5.得到当前标签下的的所有子标签 List<Element> list = rootelem.elements(); for(int i=0;i<list.size();i++){ Element e = list.get(i); System.out.println(e.getName()); } for(Element e:list){ System.out.println(e.getName()); } Iterator<Element> it = list.iterator(); while(it.hasNext()){ Element elem = it.next(); System.out.println(elem.getName()); } }
属性:
String Element.attributeValue("属性名") //获取指定名称的属性值
Attribute Element.attribute("属性名");//获取指定名称的属性对象
Attribute.getName() //获取属性名称
Attibute.getValue() //获取属性值
List<Attribute> Element.attributes(); //获取所有属性对象
Iterator<Attribute> Element.attibuteIterator(); //获取所有属性对象
@Test//获取属性 public void test4() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //获取属性:(先获的属性所在的标签对象,然后才能获取属性) //1.得到标签对象 Element contactElem = doc.getRootElement().element("contact"); //2.得到属性 //2.1 得到指定名称的属性值 String idValue = contactElem.attributeValue("id"); System.out.println(idValue); //2.2 得到指定属性名称的属性对象 Attribute idAttr = contactElem.attribute("id"); //getName: 属性名称 getValue:属性值 System.out.println(idAttr.getName() +"=" + idAttr.getValue()); //2.3 得到所有属性对象,返回LIst集合 List<Attribute> list = contactElem.attributes(); //遍历属性 for (Attribute attr : list) { System.out.println(attr.getName()+"="+attr.getValue()); } //2.4 得到所有属性对象,返回迭代器 Iterator<Attribute> it = contactElem.attributeIterator(); while(it.hasNext()){ Attribute attr = it.next(); System.out.println(attr.getName()+"="+attr.getValue()); } }
文本:
Element.getText(); //获取当前标签的文本
Element.elementText("标签名") //获取当前标签的指定名称的子标签的文本内容
@Test//获取文本 public void test5() throws Exception{ //1.读取xml文档,返回Document对象 SAXReader reader = new SAXReader(); Document doc = reader.read(new File("./src/contact.xml")); //注意: 空格和换行也是xml的内容 String content = doc.getRootElement().getText(); System.out.println(content); //获取文本(先获取标签,再获取标签上的文本) Element nameELem = doc.getRootElement().element("contact").element("name"); //1. 得到文本 String text = nameELem.getText(); System.out.println(text); //2. 得到指定子标签名的文本内容 String text2 = doc.getRootElement().element("contact").elementText("phone"); System.out.println(text2); }