java对含有命名空间的xml进行修改

网上对xml创建修改有很多资料就不再重复叙述,下面主要是对含有命名空间的,并且一个节点有多个属性的这种情况进行解析。

这是我的java代码。

package com.apk.openUser.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.NodeList;

import com.apk.openUser.model.CustomItem;

public class UpdatePttXmlUtil {
    

    public static void main(String[] args) throws IOException, DocumentException {
         
         //Java_Write_XML(); //java写xml

       
        CustomItem c = new CustomItem();
        int userId = 8;
        c.setTelName("华为t0");
        CustomItem c1 = new CustomItem();
        c1.setTelName("华为t0");
        c1.setPttUp("ptt.up");
        c1.setPttDown("ptt.down");
        c1.setPttKey("220");
        String be = "D:/userCustom/8华为t0/abc.xml";
        //String af = "D:/userCustom/"+userId+"华为t0/";
        //addPttXML(c,be,af);
        updatePttXml(be,c1,c);

    }

    public static void addPttXML(CustomItem ci,String beforePath,String aferPath) throws DocumentException, IOException {
        /*
         * 2.java修改xml
         */
        // 创建SAXReader对象
        SAXReader sr = new SAXReader(); // 需要导入jar包:dom4j
        //String path = "C:/Users/Administrator/Desktop/abc.xml";
        // 关联xml,dom4会自动识别,不要进行编码,否则可能导致中文乱码
        //Document document = sr.read(new BufferedInputStream(new FileInputStream(beforePath)));
        //Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(beforePath),"utf-8")));
        Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(new File(beforePath)))));

        
        //

        // 获取根元素
        Element root = document.getRootElement();
        
        /*
         * 2. 准备xpath
         *  //开头表示没有深的限制,可以在文档查询子元素、子元素的子元素!
         *  []中放的叫谓语,其实就是查询条件
         *  @username表示username属性,限定其必须等于方法参数username
         */
        
        /*
         * 3. 调用document方法完成查询
         */
        int itleg = 0;//0代表没有,添加机型 1代表已有进行修改。
        root.addNamespace("model", "http://schemas.xxxxx");//添加命名空间
        String xpath ="";
        if(("").equals(ci.getPttUp())||ci.getPttUp()==null) {
            xpath = "//*[@model:model='" + ci.getTelName() +"']";
        }else {
            xpath = "//*[@model:model='" + ci.getTelName() + "'and @model:up='"+ci.getPttUp()+"']";
        }
    
        /*输出最后一个子节点。
        List listElement=root.elements();//所有一级子节点的list,同理一级节点的子节点listElement.elements()

        Element e = listElement.get(listElement.size() - 1);
        List listAttr1=e.attributes();//当前节点的所有属性的list
        for(Attribute attr:listAttr1){//遍历当前节点的所有属性
            String name=attr.getName();//属性名称
            String value=attr.getValue();//属性的值
            System.out.println("属性名称:"+name+"属性值:"+value);
        }*/

        Element usermodel = (Element)root.selectSingleNode(xpath);//属性值为xpath的节点
        if(usermodel == null) {
            
            Element item = root.addElement("item");
            item.addAttribute("model:model", ci.getTelName());
            if(ci.getPttUp()!=null&&(!("").equals(ci.getPttUp()))){
               item.addAttribute("model:up", ci.getPttUp());
            }
            if(ci.getPttDown()!=null&&(!("").equals(ci.getPttDown()))){
                item.addAttribute("model:down", ci.getPttDown());
            }
            
            if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
                item.addAttribute("model:key", ci.getPttKey());
            }
            
            
            itleg=0;
            
        }else{
    /*        //遍历某个节点的所有属性
            List listAttr=usermodel.attributes();//当前节点的所有属性的list
            for(Attribute attr:listAttr){//遍历当前节点的所有属性
                String name=attr.getName();//属性名称
                String value=attr.getValue();//属性的值
                System.out.println("属性名称:"+name+"属性值:"+value);
            }*/
            
            
            if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
                if(usermodel.attribute("key")==null||("").equals(usermodel.attribute("key"))){
                    usermodel.setAttributeValue("model:key", ci.getPttKey());
                }else{
                    usermodel.setAttributeValue("key", ci.getPttKey());
                }
            }
            List listAttr=usermodel.attributes();//当前节点的所有属性的list
            for(Attribute attr:listAttr){//遍历当前节点的所有属性
                String name=attr.getName();//属性名称
                String value=attr.getValue();//属性的值
                System.out.println("属性名称:"+name+"属性值:"+value);
            }
            itleg = 1;

            
        }
        //创建文件路径
        String filePath = aferPath;
        String fileName = "abc.xml";
        OperateFileUtil dt = new OperateFileUtil();
        dt.creatFile(filePath, fileName);
        String file = filePath + fileName;
        System.out.println(file);
        saveDocument(document, new File(filePath + fileName));
        
    
    }

    public static void updatePttXml(String path,CustomItem ci,CustomItem customItem) throws DocumentException,IOException {
        try {
        SAXReader sr = new SAXReader(); // 需要导入jar包:dom4j
        Document document = sr.read(new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)))));
        Element root = document.getRootElement();
    
        int itleg = 0;//0代表没有,添加机型 1代表已有进行修改。
        root.addNamespace("model", "http://schemas.xxxxx");//添加命名空间
        String xpath ="";
        if(("").equals(customItem.getPttUp())||customItem.getPttUp()==null) {
            xpath = "//*[@model:model='" + customItem.getTelName() +"']";
        }else {
            xpath = "//*[@model:model='" + customItem.getTelName() + "'and @model:up='"+customItem.getPttUp()+"']";
        }
        Element usermodel = (Element)root.selectSingleNode(xpath);//属性值为xpath的节点
        if(usermodel!=null){
            usermodel.setAttributeValue("model", ci.getTelName());
            if(ci.getPttKey()!=null&&(!("").equals(ci.getPttKey()))){
                if(usermodel.attribute("key")==null||("").equals(usermodel.attribute("key"))){
                    usermodel.setAttributeValue("model:key", ci.getPttKey());
                }else{
                    usermodel.setAttributeValue("key", ci.getPttKey());
                }
            }
            if(ci.getPttUp()!=null&&(!("").equals(ci.getPttUp()))){
                if(usermodel.attribute("up")==null||("").equals(usermodel.attribute("up"))){
                    usermodel.setAttributeValue("model:up", ci.getPttUp());
                }else{
                    usermodel.setAttributeValue("up", ci.getPttUp());
                }
            }
            if(ci.getPttDown()!=null&&(!("").equals(ci.getPttDown()))){
                if(usermodel.attribute("down")==null||("").equals(usermodel.attribute("down"))){
                    usermodel.setAttributeValue("model:down", ci.getPttDown());
                }else{
                    usermodel.setAttributeValue("down", ci.getPttDown());
                }
            }
        }

        // 上面的操作都在内存中

        // 调用下面的静态方法完成xml的写出
        saveDocument(document, new File(path));
        }catch(Exception e) {
            e.printStackTrace();
        }
    }


    // 下面的为固定代码---------可以完成java对XML的写,改等操作
    public static void saveDocument(Document document, File xmlFile) throws IOException {
        
        //Writer osWrite = new OutputStreamWriter(new FileOutputStream(xmlFile));// 创建输出流

         //直接FileOutputStream,这样保证不乱吗,中文也能正常写入       

        FileOutputStream osWrite = new FileOutputStream(xmlFile);
        OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
        format.setNewlines(true); 
        format.setTrimText(false); 
        format.setPadText(true);
        XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
        // 指定输出文件以及格式,缺点一直没找到和如下固定xml格式的输出,知道的可以补充
        writer.write(document);// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
        //writer.flush();
        writer.close();
    }

}


 

下面是我的xml文件



             model:up="it.up"
        model:down="it.down"
        model:key="34"
        />
           model:up="it.up"
        model:down="it.down"
        model:key="34"
        />
           model:up="it.up"
        />

如果用的maven直接在pom.xml引入一下字段 


            dom4j
            dom4j
            1.6.1
        

你可能感兴趣的:(java)