JAVA xml 解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40990836/article/details/79017553

一、xml 解析

xml 是用来存放数据,这些数据需要被程序传递并使用,但是xml语法有别于使用它的语言的语法(如: java)
所以需要根据 java 语法及 xml 文档规则,将 xml 储存的数据转换成想使用它语言能使用的数据,这种过程就叫做 xml 文档解析

xml 常用文档解析规则
DOM

DOM 是面向文档结构树的对象模型解析
优点: 可以清晰的展示节点的层次关系,节点之间的联代关系,具有强大的节点操作功能
缺点: 该方式会将整个文档解析的DOM树整体存放在内存中,不利于XML大型文档操作

SAX: simple api for xml

原理: SAX 是面向文档接口的逻辑(推)模型解析
优点: 具有快速处理 xml 文档的能力,解决内存(根据需求进行必要的局部解析,且前后解析具有很大的灵活性)
缺点: 无法标注节点之间的层次关系,节点功能操作

Dom4j

原理: 整合各个语法解析优点,具有灵活的DOM文档树的内存印

二、如何利用Dom4j获取xml文档

public class Dom4j01{
    public static void main() throws DocumentException{
        // ① 通过SAXReader() 构造器 生成操作XML的输入流
        SAXReader reader = new SAXReader();
        // ② 通过操作时(读取动作), 再与文件或 流 建立起直接关系
        // 功能获取文件   
        String path = "./lesson/xml";
        // 创建文件对象
        File file = new File(path,"School.xml");
        // 创建 document 对象
        Document dom = reader.read(file);
    }
}

三、Dom4j 文档解析数据操作

public class Dom4j02{
    public static void main(String[] args) throws DocumentException{
        // ① 获取文档document
        SAXReader reader = new SAXReader();
        String path = "./lesson/xml";
        File file = new File(path,"School.xml");
        // 创建document 对象
        Document dom = reader.read(file);
        //  数据相关操作
        //  获取根节点  getRootElement
        Element root = dom.getRootElement();
        //  获取节点内容  get.TextTrim();
        String rTxt = root.getTextTrim();
        System.out.println(rTxt)
        //  获取节点个数 attributeCount()
        System.out.println(root.attibuteCount)
        //  通过索引 获取对应属性
        Atrribute attr = root.attribute(0);
        //  通过key 获取对应属性
        attr = root.attribute("value");
        System.out.println(attr);
        //  获取节点属性
        String key = attr.getName();
        String value = attr.getValue();
        System.out.println(key + ":" + value);  

        //  节点相关操作
        //  获取子节点
        List<Element> list = root.Elements();   
        for(Element e : list){
            Sysmte.out.println(e.getName());    
        }
        //  获取指定子节点
        Element stus = root.element("Student");
        System.out.println(studs);
        //  获取父节点
        Element parent = stus.getParent();
    }
}

四、修改节点

public static void fun1() throws IOException{
    // 创建文档
    // 利用DocumentHelper 功能类 创建 文档document
    Document doc = DocumentHelper.createDocument();
    // 通过dom4j通过的流  将doc  写入xml 文件
    // 创建一个参数为流的XMLWriter 对象,该类会创建一个控制台输出流
    XMLWriter writer = new XMLWriter();
    writer.write(doc);
    // 创建一个参数为流的XMLWriter 对象,则操作会依照参数流的指向
    File file = new File("./lesson/xml","test.xml");
    Writer out = new FileWriter(file);
    writer = new XMLWriter(out);
    writer.write(doc);
    // 字符流关闭时, 清空缓冲区操作
    writer.flush();
}
//  操作节点
public static void fun2() throws IOException{
    //  文档
    Document doc = DocumentHelper.creatDocument();
    //  xml 文件流
    File file = new File("./lesson/xml","test1.xml");
    //  创建XML 控制台输出流
    FileOutStream out = new FileOutputStream(file);
    OutputFormat format = OutputFormat.creatCompactFormat();
    XMLWriter writer = new XMLWriter(out,format);
    Element root = doc.addElement("Test");
    root.addAttribute("msg","测试的xml");//  添加属性   
    Element aEle = root.addElement("A");//  添加子节点
    Element bEle = root.addElement("B");//  添加子节点
    aEle.addCDATA("A标签的<cdata> 文本");
    bEle.addText("B标签的普通文本");
    Element c1 = root.addElement("C");   //  添加子节点
    c1.addElement("cc");   //  添加子节点cc 
    Element c2 = root.addElement("C");
    c2.addText("cc")  // 添加文本内容cc
    Element c3 = root.addElement("C");
    Document addComment = doc.addComment("注释");
    writer.write(doc);
    writer.close();
}
//  删除节点
public static void fun3() throws Exception{
    File file = new File("./lesson/xml","test1.xml")
    SAXReader reader = new SAXReader();
    Document doc = reader.read(file);
    // 打印到控制台
    XMLWriter w1 = new XMLWriter();
    // 修改属性 
    Element root = doc.getRootElement();
    root.attribute("msg").setText("香蕉");  //  将msg 的 值 改为香蕉
    w1.write(doc);
    // 修改节点
    // 第一个C节点下的CC节点 修改为CC节点
    Element c1 = (Element)root.elements("C").get(0);
    c1.remove(c1.element("cc"));
    c1.addElement("CC");
    // 修改节点
    Element c2 = (Element) root.elements("C").get(1);
    c2.setText(c2.getText() + "内容修改");
    // 删除节点(没有子节点的节点)  |  (只删除单节点)
    for(Object obj : root.elements()){
        Element e = (Element) obj;
        if(ele.elements().size == 0 && ele.getText().equals("")){
            root.remov(ele);
        }
    }
    w1.write(doc);
    XMLWriter w2 = new XMLWriter(new FileWriter(file));
    w2.writer(doc);
    w2.flushc();
}

猜你喜欢

转载自blog.csdn.net/qq_40990836/article/details/79017553