Dom4j对xml增删改查的实例详解

最近在弄网站收录的事,需要将网站文章的链接地址添加到一个叫sitemap.xml的文件,由于每次都要手动添加,非常的麻烦,而且一旦文章有变动,比如删除了原先收录的文章,也要去更新该xml文档,于是就想写一个简单的xml工具类对sitemap.xml进行操作。

创建xml文件其实是一个单调的过程,数据量大时可以用循环解决。需要的jar包可以度娘下载。

需要用到的类:org.dom4j.Documen、 org.dom4j.DocumentHelper、 org.dom4j.Element。

用到的方法:
添加节点:addElement()
添加属性:addAttribute()
添加节点值:addText()
添加注释:addComment()
移除节点、属性等:remove()
修改节点的文本:setText()

package com.swissabl.view;

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;    
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;   
import com.dydm.bean.SitemapBean;

public class Dom4jUtil {

/**
 * 由DocumentHelper创建document
 * 定义一个XML文档对象
 *
 * @return
 */
public static Document createDomFJ() {
    Document doc = DocumentHelper.createDocument();
    return doc;
}

/**
 * 定义一个XML文档对象
 * 由SAXReader读取xml文件生成document
 * xmlFilePath:xml文档路径
 *
 * @return
 */
public static Document readDomFJ(String xmlFilePath) {
    SAXReader reader = new SAXReader();
    Document document = null;
    try {
        document = reader.read(new File(xmlFilePath));
    } catch (DocumentException e) {
        e.printStackTrace();
    }
    return document;
}

/**
 * 给文档添加根节点
 *
 * @param elName 子节点名称
 * @param doc    文档
 * @return
 */
public static Element appendChile(String elName, Document doc) {
    Element root = doc.addElement(elName);
    return root;
}

/**
 * 给父节点添加子节点
 *
 * @param elName 子节点的名称
 * @param el     父节点
 * @return
 */
public static Element appendChile(String elName, Element el) {
    Element sub = el.addElement(elName);
    return sub;
}

/**
 * 添加子节点及其对应的值
 *
 * @param elName 子节点的名称
 * @param value  子节点的值
 * @param el     父节点
 */
public static void appendChile(String elName, String value, Element el) {
    Element sub = el.addElement(elName);
    sub.setText(value);
}

/**
 * 根目录添加注释
 *
 * @param explain 说明文字
 * @param doc
 */
public static void addCommend(String explain, Document doc) {
    doc.addComment(explain);
}

/**
 * 为子节点添加说明
 *
 * @param explain
 * @param element
 */
public static void addCommend(String explain, Element element) {
    element.addComment(explain);
}

/**
 * 为节点添加属性
 *
 * @param attName
 * @param attValue
 * @param element
 */
public static void addAttribute(String attName, String attValue,
                                Element element) {
    element.addAttribute(attName, attValue);
}

/***
 * xml文档转化为string
 * xmlFilePath:"WebRoot\\sitemap.xml"
 */
public static String xmlToString(String xmlFilePath) {
    String text = "";
    try {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(xmlFilePath));
        text = document.asXML();
    } catch (DocumentException e) {
        e.printStackTrace();
    }
    return text;
}

/***
 * 字符串转XML
 *
 * @param xmlText:xml格式的字符串
 * @return
 */
public static Document stringToDocument(String xmlText) {
    Document document = null;
    try {
        document = DocumentHelper.parseText(xmlText);
    } catch (DocumentException e) {
        e.printStackTrace();
    }
    return document;
}

/***
 * sitemap.xml转化为SitemapBean实体类
 */
@SuppressWarnings("unchecked")
public static List<SitemapBean> sitemapToSitemapBeans() {
    List<SitemapBean> sitemapBeans = new ArrayList<SitemapBean>();
    try {
        String xmlFilePath = "WebRoot\\sitemap.xml";
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(xmlFilePath));
        //获取根节点
        Element rootElement = document.getRootElement();
        // 获取所有子节点
        List<Element> childList = rootElement.elements();
        //输出节点数目
        System.out.println(childList.size());
        Iterator<Element> iter = childList.iterator();
        int i = 0;
        while (iter.hasNext()) {
            i++;
            Element urlElement = (Element) iter.next();
            //节点文本内容原样输出,不处理空格
            //String loc=urlElement.element("loc").getText();
            //节点文本内容处理空格后输出
            String loc = urlElement.element("loc").getTextTrim();
            String lastmod = urlElement.element("lastmod").getTextTrim();
            String changefreq = urlElement.element("changefreq").getTextTrim();
            String priority = urlElement.element("priority").getTextTrim();
            SitemapBean sitemapBean = new SitemapBean();
            sitemapBean.setLoc(loc);
            sitemapBean.setLastmod(lastmod);
            sitemapBean.setChangefreq(changefreq);
            sitemapBean.setPriority(priority);
            sitemapBeans.add(sitemapBean);
        }

    } catch (DocumentException e) {

        e.printStackTrace();
    }
    return sitemapBeans;
}

/***
 * 往sitemap.xml添加节点
 */
public static void addElementToSitemap(String loc, String lastmod, String changefreq, String priority) {
    try {
        String xmlFilePath = "WebRoot\\sitemap.xml";
        SAXReader reader = new SAXReader();
        //创建document
        Document document = reader.read(new File(xmlFilePath));

        //获取根节点
        Element rootElement = document.getRootElement();

        //往根节点添加url子节点
        Element urlElement = rootElement.addElement("url");

        //往url子节点添加loc节点
        Element locElement = urlElement.addElement("loc");
        //为loc节点添加文本
        locElement.setText(loc);

        //为loc节点添加属性
        //locElement.addAttribute("attr1", "attr1Val");

        //加入一行注释 
        //locElement.addComment("我是第一代码的注释");

        //往url子节点添加lastmod节点
        Element lastmodElement = urlElement.addElement("lastmod");
        //为lastmod节点添加文本
        lastmodElement.setText(lastmod);

        //往url子节点添加changefreq节点
        Element changefreqElement = urlElement.addElement("changefreq");
        //为changefreq节点添加文本
        changefreqElement.setText(changefreq);

        //往url子节点添加priority节点
        Element priorityElement = urlElement.addElement("priority");
        //为priority节点添加文本
        priorityElement.setText(priority);

        //保存xml
        saveXMLFile(document, xmlFilePath);
    } catch (DocumentException e) {
        e.printStackTrace();
    }
}

/***
 * 保存xml
 *
 * @param document
 */
public static void saveXMLFile(Document document, String filePath) {
    try {
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("utf-8");
        XMLWriter writer = new XMLWriter(
                new FileWriter(new File(filePath)), format);
        writer.write(document);
        writer.close();
    } catch (Exception e) {

    }
}

/***
 * 删除节点
 * locText:要删除的节点的文本内容
 */
public static void deleteNode(String locText) {
    String xmlFilePath = "WebRoot\\sitemap.xml";
    //获取一个文档对象
    Document document = readDomFJ(xmlFilePath);

    //获取根节点
    Element rootElement = document.getRootElement();
    // 获取所有子节点
    List<Element> childList = rootElement.elements();
    Iterator<Element> iter = childList.iterator();
    while (iter.hasNext()) {
        Element urlElement = (Element) iter.next();
        //节点文本内容处理空格后输出
        Element locElement = urlElement.element("loc");
        String loc = locElement.getTextTrim();
        //节点文本内容原样输出,不处理空格
        //String loc=locElement.getText();
        if (loc.equals(locText)) {
            //修改文本
            //locElement.setText("新的文本");

            //从该loc节点的父节点里删除该节点
            urlElement.remove(locElement);

            //删除该节点的父节点
            //rootElement.remove(locElement.getParent());
            //或者
            //rootElement.remove(urlElement);
        }
    }
}

/***
 * 修改、删除节点属性、删除节点属性所在节点的父节点
 * attrVal:要删除的节点的属性值
 */
public static void deleteAttr(String attrVal) {
    String xmlFilePath = "WebRoot\\sitemap.xml";
    //获取一个文档对象
    Document document = readDomFJ(xmlFilePath);

    //获取根节点
    Element rootElement = document.getRootElement();
    // 获取所有子节点
    List<Element> childList = rootElement.elements();
    Iterator<Element> iter = childList.iterator();
    while (iter.hasNext()) {
        Element urlElement = (Element) iter.next();
        //节点文本内容处理空格后输出
        Element locElement = urlElement.element("loc");
        List<Attribute> attrs = locElement.attributes();
        Iterator<Attribute> iter2 = attrs.iterator();
        while (iter2.hasNext()) {
            Attribute attribute = (Attribute) iter2.next();
            //获取属性值
            String value = attribute.getValue();
            if (value.equals(attrVal)) {

                //修改属性值
                //attribute.setValue("新的属性值");

                //删除该属性
                locElement.remove(attribute);

                //删除该属性所在节点的父节点
                //urlElement.remove(locElement);
            }
        }

    }
  }
}

文章地址:https://www.diyidaima.com/blogs/uefzm1ln.html

如果此博文帮助到你,麻烦点个赞哈!

发表回复

后才能评论