XML DOM解析文档 获取文本DoM4j实现增删改

来源:互联网 发布:交通枢纽大数据 编辑:程序博客网 时间:2024/05/17 03:32
XML
可扩展标记语言:标签可以自定义
命名规范:不能用数字开头,不能使用纯数字,区分大小写
功能:用作配置文件
            用作网络数据传输的载体


组成部分
a.文档声明:<?xml version="1.0" encoding="utf-8"?>
        encoding告诉浏览用什么编码去解析
        文档声明必须在第一行,顶格
b.根标签:有且仅有一个根标签
c.其他标签:有开始标签,一定要有结束标签
d.文本:CDATA区:该区域的文本,会按照纯文本解析
格式:<![CDATA[内容]]>


<?xml version="1.0" encoding="UTF-8"?><students><student id="s001"><name>张三</name><age>23</age><tel>110</tel></student><student id="s002"><name>李四</name><age>24</age><tel>119</tel></student></students>

解析XML:
DOM:
将文档的各个组成部分 抽取一个对象
                Element 标签对象
                Attribute 属性对象
                Text 文本对象
                Comment 注释对象
                Node 节点对象
                Doucment 文档对象
                解析过程:将文档一次性,加载进内存,然后将文档各个组成不封抽取为对象
                优点:能够对文档进行增删改查
                缺点:耗内存,适用于PC端

jar包(解析器)名称:dom4j-1.6.1.jar
SAX:
基于事件,逐行解析,一次读取一行,释放一行
优点:不占内存,适用于移动端
缺点:只能查,不能增删改

jar包(解析器)名称:kxml2-2.3.0.jar
xmlpull-1-1-3-4c.jar


DOM4J解析器:

获取标签对象:
导入dom4j-1.6.1.jar
创建一个XML文件或者粘贴一个到项目底下
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Iterator;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class DOMDemo {public static void main(String[] args) throws Exception {//导入dom4j.jar包//创建解析器对象SAXReader reader = new SAXReader();//加载xml文件Document doc = reader.read(new FileInputStream("students.xml"));//获取跟标签对象  getRootElemElement rootElement = doc.getRootElement();System.out.println(rootElement.getName());//输出students//获取跟标签下的子标签 element();Element element = rootElement.element("student1");System.out.println(element.getName());//获取所有子标签  此方法返回结果集List<Element> list = rootElement.elements();for(Element e : list){System.out.println(e.getName());}//迭代器获取 elementIteratorIterator<Element> iterator = rootElement.elementIterator();while(iterator.hasNext()){  Element element2 = iterator.next();    System.out.println(element2.getName());}}}


获取属性和标签里的文本


import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.Iterator;import java.util.List;import org.dom4j.Attribute;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class DOMtxt {public static void main(String[] args) throws Exception {//获取解析器对象SAXReader reader = new SAXReader();//加载XML文件Document doc = reader.read(new FileInputStream("students.xml"));//方式1:分布获取属性对象//获取跟标签对象Element rootElement = doc.getRootElement();//获取标签对象Element element = rootElement.element("student1");//获取属性id对象Attribute attribute = element.attribute("id");//获取值String value = attribute.getValue();//属性的值s01String name = attribute.getName();System.out.println(name+"--"+value);//方式2:直接获取属性值String value2 = rootElement.element("student1").attribute("id").getValue();System.out.println(value2);//方式3:获取所有属性对象 attributesList<Attribute> attributes = rootElement.element("student1").attributes();for(Attribute att : attributes){String name2 = att.getName();String value3 = att.getValue();System.out.println(name2+"--"+value3);}//方式4:通过迭代器获取所有属性值Iterator<Attribute> attributeIterator = rootElement.element("student1").attributeIterator();while(attributeIterator.hasNext()){Attribute attribute2 = attributeIterator.next();String name2 = attribute2.getName();String value3 = attribute2.getValue();System.out.println(name2+"--"+value3);}//获取标签间的文本//方式1:层层往下拿String text = doc.getRootElement().element("student1").element("name").getText();System.out.println(text);//方式2: 一步String text2 = doc.getRootElement().element("student1").elementText("name");System.out.println(text2);}}



获取节点:


a.node():获取单个节点对象;nodeIterator(); 获取多个节点对象,只能获取子节点
b.获取根标签对象 getRootElement()
c.Element()获取第一个子标签
   Elements() 获取所有的子标签 
   elememtesIterator() 获取所有子标签对象
d.attribute() 获取单个属性对象  getName()获取属性的键  getValue()获取属性的值
   attributes()获取所有的属性对象 
   attributeIterator() 获取所有的属性对象
   直接获取属性对象的值 attributeValue()
e.先获取到文本所在的标签对象 通过getText()拿出这个标签直接的文本elementText("name");

import java.io.FileInputStream;import java.util.Iterator;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.Node;import org.dom4j.io.SAXReader;public class DOM4JDemo {public static void main(String[] args) throws Exception {// 导入DOM4J jar包// 创建解析器对象SAXReader reader = new SAXReader();// 加载xml文件Document doc = reader.read(new FileInputStream("students.xml"));// 方式1:分布获取属性对象// 获取跟标签对象Element rootElement = doc.getRootElement();// 使用递归获取所有节点getNodes(rootElement);}private static void getNodes(Element ele) {// 输出当前节点System.out.println(ele.getName());// 迭代器获取所有子节点Iterator<Node> iterator = ele.nodeIterator();// 遍历while (iterator.hasNext()) {Node nodes = iterator.next();// 判断节电是否属于标签if (nodes instanceof Element) {Element eles = (Element) nodes;// 调用递归getNodes(eles);}}}}




封装数据:把从XML文件中解析出来的数据封装起来




1.创建javabean存放
package FZstusdent;import java.io.Serializable;public class stu implements Serializable {/** *  */private static final long serialVersionUID = 1L;private String  age;private String name;private String  tel;public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}public stu(String age, String name, String tel) {super();this.age = age;this.name = name;this.tel = tel;}public stu() {super();}}



2.
package FZstusdent;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.ArrayList;import java.util.Iterator;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class FZDemo {public static void main(String[] args) throws FileNotFoundException, DocumentException {//创建集合存储对象ArrayList<stu> list = new ArrayList<stu>();//创建解析器SAXReader reader = new SAXReader();//加载XML文件Document doc = reader.read(new FileInputStream("students.xml"));//获取跟标签对象Element rootElement = doc.getRootElement();//获取所有的子标签对象Iterator<Element> iterator = rootElement.elementIterator();//遍历取出数据并封装while(iterator.hasNext()){Element ele = iterator.next();String name = ele.elementText("name");String age = ele.elementText("age");String tel= ele.elementText("tel");//封装到对象中   stu newStu = new stu(age, name, tel);      //添加到集合中   list.add(newStu);}//遍历集合for(stu s: list){System.out.println(s.getAge()+s.getName()+s.getTel());}}}



15张三110
20李四120


DOM4J实现增删改
例子:将赵三改为王五 删除属性id=s01

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class XiuGaiDEmo {public static void main(String[] args) throws Exception {//读取XML文件SAXReader reader = new SAXReader();Document doc = reader.read(new FileInputStream("students.xml"));//修改文本    将张三改为王五doc.getRootElement().element("student1").element("name").setText("王五");//删除属性id=s01Element rootElement = doc.getRootElement();//获取子标签集List<Element> list = rootElement.elements();//遍历for(Element ele : list){//获取属性的值String value = ele.attributeValue("id");if(value.equals("s01")){ele.attribute("id").detach();}}//重新写入硬盘  覆盖掉XMLWriter writer = new XMLWriter(new FileOutputStream("students.xml"));writer.write(doc);writer.close();}}



例子:添加
添加标签:addElement("标签名");
添加属性:addAtrriburte("属性","属性值")
添加文本:addText("文本");

package xiugai;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.XMLWriter;import org.xml.sax.DocumentHandler;public class ZengJia {public static void main(String[] args) throws IOException {//用代码写一个XML//文档帮助类写一个声明Document doc = DocumentHelper.createDocument();//添加一个跟标签Element rootElement = doc.addElement("students");//添加一个子标签Element element = rootElement.addElement("stu");//添加属性element.addAttribute("id", "s01");//添加名字标签Element name = element.addElement("name");//添加名字name.addText("张三");//添加年龄标签Element age = element.addElement("age");//添加年龄age.addText("22");//写到硬盘上XMLWriter writer = new XMLWriter(new FileOutputStream("stud.xml"));writer.write(doc);writer.close();}}











阅读全文
0 0