美文网首页
dom4j 添加父节点的问题

dom4j 添加父节点的问题

作者: NullPointerE | 来源:发表于2017-03-21 19:26 被阅读0次

原XML格式如下:

dom4j 添加父节点的问题

要将它转换为如下的格式:

dom4j 添加父节点的问题

百度了好久,网上都没有XML添加父节点的例子,最初想用最笨的方法一个Element一个Element的添加,那个实在太笨了。看着节点名字差不多就想有没有类似模糊查询的方法,然后考虑xpath,正则表达式来获取又对这俩不熟,最后想了好久,想到是根据名字来获取的,就是字符串啊,然后就用的String.contains()来匹配的。下面上代码。
import java.io.File;
import java.io.FileWriter;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.dom.DOMDocumentFactory;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**

  • @author 陈文五

/
public class XmlTest {
/
*

  • @param InPath 要转换的XML文件路径

  • @param eleName1 父节点名(子节点名的一部分)

  • @param eleName2 父节点名(子节点名的一部分)

  • @param OutPath 转换后的XML输出路径
    */
    public static void changeXML(String InPath,String eleName1,String eleName2,String OutPath) {
    Document doc = DOMDocumentFactory.getInstance().createDocument();
    SAXReader reader = new SAXReader();
    File file = new File(InPath);
    Document document;
    try {
    document = reader.read(file);
    Element root = document.getRootElement();
    Element r = DocumentHelper.createElement(root.getName());
    doc.add(r);
    Element e = DocumentHelper.createElement(eleName1);

         Element ele = DocumentHelper.createElement(eleName2);
         
         List eleList = root.elements();
         for(Element element:eleList){
             if(element.getName().contains(eleName1)){
                 e.add((Element)(element.clone()));
             }else if(element.getName().contains(eleName2)){
                 ele.add((Element)(element.clone()));
             }else{
                 r.add((Element)(element.clone()));
             }
         }
         r.add(e);
         r.add(ele);
         OutputFormat format = OutputFormat.createPrettyPrint();
         format.setEncoding("gb2312");
         XMLWriter writer = new XMLWriter(
         new FileWriter(new File(OutPath)), format);
         writer.write(doc);
         writer.close();
     } catch (DocumentException e) {
         e.printStackTrace();
     }catch (Exception e){
         e.printStackTrace();
     }
    

    }
    }

以上就是最终的代码,中间卡在了添加节点在同一层父节点下,卡了我快一个小时。那么给出之前的代码,聪明如你,看一看体会一下问题是出在哪里,怎么解决的。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.dom.DOMDocumentFactory;
import org.dom4j.dom.DOMElement;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XmlTest {

public static void changeXML(String inPath,String eleName1,String eleName2,String outPath) {
    Document doc = DOMDocumentFactory.getInstance().createDocument();
    SAXReader reader = new SAXReader();
    File file = new File(inPath);
    Document document;
    try {
        document = reader.read(file);
        Element root = document.getRootElement();
        DOMElement r = (DOMElement) doc.addElement(root.getName());
        List eleList = root.elements();
        for(Element element:eleList){
            if(element.getName().contains(eleName1)){
                int index = 0;
                Element e = null;
                if(e==null){
                    e = r.addElement(eleName1); 
                }e.add((Element)(element.clone()));
            }else if(element.getName().contains(eleName2)){
                Element ele = null;
                if(ele==null){
                ele = r.addElement(eleName2);
                }
                ele.add((Element)(element.clone()));
            }else{
                r.add((Element)(element.clone()));
            }
        }
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        XMLWriter writer = new XMLWriter(
        new FileWriter(new File("E://new.xml")), format);
        writer.write(doc);
        writer.close();} catch (DocumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (Exception e){
        e.printStackTrace();
    }
}  

}

这是帮一同进公司的妹子做的题,由于公司项目大量使用XML,帮忙做的同时自己也巩固一下dom4j。写这篇文章也是给广大受xml折磨的同志一个例子,毕竟在自己做这道题的时候网上都没有找到给xml添加父节点的例子,也害得我花了两个多小时才解决。有什么问题疑问也欢迎留言。以上。

相关文章

  • dom4j 添加父节点的问题

    原XML格式如下: 要将它转换为如下的格式: 百度了好久,网上都没有XML添加父节点的例子,最初想用最笨的方法一个...

  • 2017-03-11 JS学习笔记 am

    创建节点 创建节点一般通过 document 设置属性 添加节点添加节点,一般通过它的父节点 删除节点 插入节点一...

  • XML解析

    dom4j 元素 解析xml文件 获取根节点 遍历 查 保存 添加 删除 改 XPath 使用XPath对xml文...

  • 节点的相关操作

    创建一个节点我们通过createElement() 添加节点,一般是这个被添加标签的父节点appendChild(...

  • dom4j将一个xml文件中的节点复制到另一个xml文件

    1 需要添加dom4j的jar包https://mvnrepository.com/artifact/dom4j/...

  • 2022-04-13

    element tree 使用 append或者insertBefore 动态添加子节点 要实现的效果,点击父节点...

  • day03

    A.今天你学到了什么 1.添加子元素节点方法 2.获取父元素节点 3.界面删除父节点 4.更改子节点属性 5.获取...

  • javascript学习笔记--增删改查(一)

    createElement:创建一个节点appendChild:向父节点添加子节点点击btn01 创建一个广州节点...

  • 事件委托

    事件委托是通过事件冒泡的原理,利用父级给子级添加事件。事件委托的好处是不需要去遍历元素的子节点,只需要给父节点添加...

  • DOM插入节点

    appendChild,把一个子节点添加到父节点的最后一个子节点 insertBefore(newElement,...

网友评论

      本文标题:dom4j 添加父节点的问题

      本文链接:https://www.haomeiwen.com/subject/mzggnttx.html