xml解析:用程序来读取xml的内容。
xml的解析方式有两种:
1、DOM解析
2、SAX解析
xml解析对应的工具大致有以下几种:
DOM解析工具:
1)JAXP(oracle-Sun公司官方)
2)JDOM工具(非官方)
3)Dom4J工具(非官方)三大框架默认读取xml的工具就是Dom4J
SAX解析工具:
1)Sax解析工具(oracle-sun 公司官方)
DOM解析
原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)xml文档的内容。
DOM(Document Object Model)文档对象模型,DOM的三层模型将html和xml定义成树形结构,文档中的标签、属性、文本等都封装成节点对象。
节点对象:
根节点:没有父节点的节点对象,xml中只有一个根节点。
元素节点:根节点和根节点中的所有标签都是元素节点。
属性节点:<student id=“001”></student> id就是属性节点。
文本节点:<name>zhangsan</name> zhangsan就是文本节点
注释节点:<!-- --> xml文档中的注释信息
Dom4j使用
Dom4j工具是非官方的,这里提供一个下载地址:http://pan.baidu.com/s/1c5WL0i
Dom4j中集成的 XPath(路径查询语言)支持、 XML Schema(约束模式文档)支持。
使用步骤:
1)导入dom4j的核心包,dom4j-1.6.1.jar
2)编写Dom4j读取xml文件的代码。
Dom4j的体系结构
常用方法API
1)获取xml文档对象Document:
1 File xmlFile = new File(“test.xml”);//找到文件 2 SAXReader reader = new SAXReader(); //创建reader对象 3 Document xmlDoc = reader.read(xmlFile); //读取xml文件,并生成document对象
2)获取标签元素节点
1 Element root = xmlDoc.getRootElement(); //获取根元素对象 2 String elementName = root.getName(); //获取根元素的标签名 3 lement element = root.element(“元素名称"); //通过元素名称获取第一个元素名称的对象 4 List elementList = root.elements(); //获取所有这季节子元素的集合 5 Iterator<Element> root.elementIterator("标签名");// 指定名称的所有子标签
3)获取属性元素节点
1 Attribute attribute = element.attribute(“属性名称"); //通过属性名获取元素属性对象 2 Attribute attribute = element.attribute(0); //通过索引获取属性对象 3 List attributeList = root.attributes(); //获取所有属性对象集合 4 Iterator<Attribute> root.attibuteIterator(); //获取所有属性对象 5 String value = attribute.getValue(); //通过属性值 6 String name = attribute.getName(); //通过属性名 7 String value = element.attributeValue(“属性名称”); //通过属性名来获取元素的属性值
4)获取属性文本节点
1 String text = element.getText(); //获取element元素的内部文本 2 String text = element.elementText(“子元素名称”); //获取element子元素内部文本
5)创建增加操作(文档对象、标签、属性、文本)
1 Document document = DocumentHelper. createDocument(); //创建文档Document 2 Element element = document.addElement(“元素名称"); //创建元素 3 element. addAttribute(“属性名”,“属性值"); //创建属性--添加属性方法返回的是原元素对象。如同StringBuffer。 4 element.addText(“文本"); //创建文本
6)修改操作(属性、文本)
1 //=====修改属性 2 Element contactElem = doc.getRootElement().element("contact"); 3 Attribute idAttr = contactElem.attribute("id"); 4 idAttr.setValue("003"); //通过属性对象来修改属性值 5 6 Element contactElem = doc.getRootElement().element("contact"); 7 contactElem.addAttribute("id", "004"); //通过添加的方式来进行覆盖修改 8 9 //=====修改文本 10 Element rootElem = doc.getRootElement(). 11 rootElem.setText("李四"); //修改文本
7)删除操作(标签、属性、文本)
1 remove(Element element) //删除标签 2 remove(Attribute attribute) //删除属性 3 remove(Text text) //删除文本
8)写出xml文档
1 FileOutputStream out = new FileOutputStream("e:/contact.xml"); //指定文件输出的位置 2 //指定写出格式 3 OutputFormat format = OutputFormat.createCompactFormat(); //紧凑的格式.去除空格换行.项目上线的时候 4 //OutputFormat format = OutputFormat.createPrettyPrint(); //漂亮的格式.有空格和换行.开发调试的时候 5 format.setEncoding("utf-8"); //指定生成的xml文档的编码,同时影响了xml文档保存时的编码 和 xml文档声明的encoding的编码(xml解析时的编码) 6 XMLWriter writer = new XMLWriter(out,format); 1.创建写出对象 7 writer.write(doc); //写出对象 8 writer.close(); //关闭流
代码示例:
1、把xml文档信息封装到对象中
contact.xml文件
1 <?xml version="1.0" encoding="utf-8"?> 2 <contactList> 3 <contact id="001"> 4 <name>张三</name> 5 <age>20</age> 6 <phone>134222223333</phone> 7 <email>zhangsan@qq.com</email> 8 <qq>432221111</qq> 9 </contact> 10 <contact id="002"> 11 <name>李四</name> 12 <age>20</age> 13 <phone>134222225555</phone> 14 <email>lisi@qq.com</email> 15 <qq>432222222</qq> 16 </contact> 17 </contactList>
java文件
1 import java.util.List; 2 3 import org.dom4j.Document; 4 import org.dom4j.Element; 5 import org.dom4j.io.SAXReader; 6 7 /** 8 * 把xml文档信息封装到对象中 9 * @author APPle 10 * 11 */ 12 public class Demo4 { 13 14 public static void main(String[] args) throws Exception{ 15 List<Contact> list = new ArrayList<Contact>(); 16 17 //读取xml,封装对象 18 SAXReader reader = new SAXReader(); 19 Document doc = reader.read(new File("./src/contact.xml")); 20 //读取contact标签 21 Iterator<Element> it = doc.getRootElement().elementIterator("contact"); 22 while(it.hasNext()){ 23 Element elem = it.next(); 24 //创建Contact 25 Contact contact = new Contact(); 26 contact.setId(elem.attributeValue("id")); 27 contact.setName(elem.elementText("name")); 28 contact.setAge(elem.elementText("age")); 29 contact.setPhone(elem.elementText("phone")); 30 contact.setEmail(elem.elementText("email")); 31 contact.setQq(elem.elementText("qq")); 32 list.add(contact); 33 } 34 35 for (Contact contact : list) { 36 System.out.println(contact); 37 } 38 } 39 }
2、新建xml文档,并修改和删除里面的内容
创建xml文档的java代码:
1 public void createXMLDocument() throws Exception{ 2 //1.内存创建xml文档 3 Document doc = DocumentHelper.createDocument(); 4 5 //2.写入内容 6 Element rootElem = doc.addElement("Students"); 7 8 //2.1 增加标签 9 Element studentElem1 = rootElem.addElement("Student"); 10 //2.2 增加属性 11 studentElem1.addAttribute("id", "1"); 12 //2.3 增加标签,同时设置文本 13 studentElem1.addElement("name").setText("张三"); 14 studentElem1.addElement("gender").setText("男"); 15 studentElem1.addElement("grade").setText("计算机1班"); 16 studentElem1.addElement("address").setText("广州"); 17 18 //2.1 增加标签 19 Element studentElem2 = rootElem.addElement("Student"); 20 //2.2 增加属性 21 studentElem2.addAttribute("id", "2"); 22 //2.3 增加标签,同时设置文本 23 studentElem2.addElement("name").setText("李四"); 24 studentElem2.addElement("gender").setText("女"); 25 studentElem2.addElement("grade").setText("计算机2班"); 26 studentElem2.addElement("address").setText("北京"); 27 28 29 //3.内容写出到xml文件 30 //3.1 输出位置 31 FileOutputStream out = new FileOutputStream("e:/student.xml"); 32 //3.2 指定格式 33 OutputFormat format = OutputFormat.createPrettyPrint(); 34 // 设置编码 35 format.setEncoding("utf-8"); 36 XMLWriter writer = new XMLWriter(out,format); 37 //3.3 写出内容 38 writer.write(doc); 39 //3.4关闭资源 40 writer.close(); 41 42 }
修改标签内容
1 public void changeContent() throws Exception{ 2 //1.查询到id为2的学生 3 Document doc = new SAXReader().read(new File("e:/student.xml")); 4 //1.1 找到所有的Student标签 5 Iterator<Element> it = doc.getRootElement().elementIterator("Student"); 6 while(it.hasNext()){ 7 Element stuElem = it.next(); 8 //1.2 查询id为id的学生标签 9 if(stuElem.attributeValue("id").equals("2")){ 10 stuElem.element("name").setText("王丽"); 11 break; 12 } 13 } 14 15 16 //3.1 输出位置 17 FileOutputStream out = new FileOutputStream("e:/student.xml"); 18 //3.2 指定格式 19 OutputFormat format = OutputFormat.createPrettyPrint(); 20 // 设置编码 21 format.setEncoding("utf-8"); 22 XMLWriter writer = new XMLWriter(out,format); 23 //3.3 写出内容 24 writer.write(doc); 25 //3.4关闭资源 26 writer.close(); 27 }
删除标签
1 public void deleteContent() throws Exception{ 2 //1.查询到id为2的学生 3 Document doc = new SAXReader().read(new File("e:/student.xml")); 4 //1.1 找到所有的Student标签 5 Iterator<Element> it = doc.getRootElement().elementIterator("Student"); 6 while(it.hasNext()){ 7 Element stuElem = it.next(); 8 //1.2 查询id为id的学生标签 9 if(stuElem.attributeValue("id").equals("2")){ 10 //1.3 删除该学生标签 11 stuElem.detach(); 12 break; 13 } 14 } 15 16 17 //3.1 输出位置 18 FileOutputStream out = new FileOutputStream("e:/student.xml"); 19 //3.2 指定格式 20 OutputFormat format = OutputFormat.createPrettyPrint(); 21 // 设置编码 22 format.setEncoding("utf-8"); 23 XMLWriter writer = new XMLWriter(out,format); 24 //3.3 写出内容 25 writer.write(doc); 26 //3.4关闭资源 27 writer.close(); 28 }
来源:https://www.cnblogs.com/nicker/p/6432902.html