DOM4j 操作XML

<?xml version="1.0" encoding="GBK"?>  
<persons>
    <men>
        <person id = "20111907">潘腾</person>
        <person id = "20111901">雷帅</person>
    </men>
    <women>
        <person id = "20111908">杨悦</person>
        <person id = "20111908">张东月</person>
    </women>
</persons>
import java.io.*;
import java.io.File;
import java.io.FileOutputStream;  
import java.io.FileWriter;  
import org.dom4j.*;
import org.dom4j.io.*;
import java.util.*;
import org.jaxen.*;
public class DOM_XML {
    public static void main(String[] args)
    {
        try
        {
//            read_xml1();
//            read_xml2();
//            read_xml3();
//            read_xml4();
//            creatXml();
            modifyXML();
        }
        catch(Exception e)
        {
            System.out.println("错误信息:" + e);
        }
    }
    
    /**
     * 第一种方式 使用迭代器读XML
     */
    public static void read_xml1()
    {
        try
        {
            SAXReader reader = new SAXReader();                        //解析器
            Document doc = reader.read(new File("persons.xml"));    //文档对象
            Element root = doc.getRootElement();                    //获取根元素  <persons>
            Iterator it = root.elementIterator();                    //<men>   <women>
            while(it.hasNext())
            {
                Element ele = (Element)it.next();
                Iterator sec_it = ele.elementIterator();
                while(sec_it.hasNext())
                {
                    Element man = (Element)sec_it.next();      //不调用next方法,就不会下移  便会产生死循环
                    String name = man.getName();    
                    String attr = man.attributeValue("id");
                    String content = man.getText();
                    System.out.println("name:" + name + "
id: " + attr + "
Content: " + content);
                }
            }
        }
        catch(Exception e)
        {
            
        }
    }
    
    /**
     * 第二种方式 elements
     */
    public static void read_xml2()
    {
        try
        {
            SAXReader reader = new SAXReader();                        //解析器
            Document doc = reader.read(new File("persons.xml"));    //文档对象
            Element root = doc.getRootElement();                    //获取根元素  <persons>
            List<Element> listEle = root.elements("men");            //获取root下的所有men元素
             List<Element> listMen = listEle.get(0).elements("person");        //获取men下的所有person元素
             for(Element element_obj:listMen)
             {
                String name = element_obj.getName();    
                String attr = element_obj.attributeValue("id");
                String content = element_obj.getText();
                System.out.println("name:" + name + "
id: " + attr + "
Content: " + content);
             }
        }
        catch(Exception e)
        {
            
        }
    }
    
    /**
     * 第三种方式  使用适配器  这个暂时没有搞懂
     */
    public static void read_xml3()
    {
        try
        {
            SAXReader reader = new SAXReader();                        //解析器
            Document doc = reader.read(new File("persons.xml"));    //文档对象
            Element root = doc.getRootElement();                    //获取根元素  <persons>
             
             //第三种方式 适配器
             doc.accept(new VisitorSupport() {//使用观察器的子类,来完成对xml文件的读取。
                   
                   public void visit(Element el) {//利用观察期进行xml的读取。
                    
                    System.out.println(el.getName()+": "+el.getText());
                   }
                   
                  });
        }
        catch(Exception e)
        {
            
        }
        
    }
    
    /**
     * 第四种方式 selectNodes
     * selectNodes的参数是元素路径  需要学习XPath相关知识
     */
    public static void read_xml4()
    {
        try
        {
            SAXReader reader = new SAXReader();                        //解析器
            Document doc = reader.read(new File("persons.xml"));    //文档对象
            Element root = doc.getRootElement();                    //获取根元素  <persons>
             
    
            //第四种 使用selectNodes读取XML
            //需要导入 org.jaxen.* 包   否则会报错
            List list = doc.selectNodes("//persons/men/person");//使用selectNodes获取所要查询xml的节点。
             for(Object obj:list){//遍历节点,获取节点内数据。                   
                   Element el = (Element)obj;
                   System.out.println(el.getText());
                  }
        }
        catch(Exception e)
        {}
    }

    /**
     * 创建XML文件 
     * XML文件第一行 encoding值为UTF-8   这是错误的
     * java 在windows 中文版环境下 默认采用的是GBK,所以需要手动更改
     */
    public static void creatXml()
    {
        try
        {
            Document newdoc = DocumentHelper.createDocument();
            Element persons = newdoc.addElement("persons");
            Element men = persons.addElement("men");
            Element person1 = men.addElement("person");
            person1.addAttribute("id", "20111907");
            person1.setText("panteng");
            Element person2 = men.addElement("person");
            person2.addAttribute("id", "20111901");
            person2.setText("leishuai");
            
            File newxml = new File("newFile.xml");
            if(newxml.exists())
            {
                newxml.delete();
            }
            newxml.createNewFile();    //创建文件
            XMLWriter out = new XMLWriter(new FileWriter(newxml));
            out.write(newdoc);
            out.flush();
            out.close();
            System.out.println("文件创建完毕");
        }
        catch(Exception e)
        {
            
        }
    }

    /**
     * 修改XML   删除节点、修改 添加属性
     */
    public static void modifyXML()
    {
        try
        {
            SAXReader reader = new SAXReader();                        //解析器
            Document doc = reader.read(new File("persons.xml"));    //文档对象
            Element root = doc.getRootElement();                    //获取根元素  <persons>
            Element men = root.element("men");
            //删除雷帅的记录元素
            Iterator it = men.elementIterator();
            while(it.hasNext())
            {
                Element ele = (Element)it.next();
                if(ele.getText().equals("雷帅"))
                {
                    men.remove(ele);
                }
            }
            //增加伟男记录
            Element weiNan = men.addElement("person");
            weiNan.setText("伟男");
            
            //修改 潘腾的id 并增加age属性
            Iterator it2 = men.elementIterator();
            while(it2.hasNext())
            {
                Element ele = (Element)it2.next();
                if(ele.getText().equals("潘腾"))
                {
                    ele.setAttributeValue("id", "080635");
                    ele.addAttribute("age", "23");
                }
            }
            
            File newxml = new File("newFile.xml");
            if(newxml.exists())
            {
                newxml.delete();
            }
            newxml.createNewFile();    //创建文件
            XMLWriter out = new XMLWriter(new FileWriter(newxml));
            out.write(doc);
            out.flush();
            out.close();
            System.out.println("文件更新完毕");
        }
        catch(Exception e)
        {
            System.out.println("错误信息:" + e);
        }

    }
}

不难看出,JAVA  对xml的修改,实际上是修改了doc对象,然后删除原来的文件,将这个对象 重新写入一个文件,文件名和原先的相同。

利用XSD对XML进行验证:

import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
import org.dom4j.util.XMLErrorHandler;

/**
     * 基于XSD验证XML
     */
    public static void validateXMLByXSD(String XMLpath,String XSDpath) 
    {
        try
        {
            //建立schema工厂
           SchemaFactory schemaFactory=SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
           //建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证
           File schemaFile=new File(XSDpath);
           //利用schema工厂,接收验证文档文件对象生成Schema对象
           Schema schema=schemaFactory.newSchema(schemaFile);
           //通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
           Validator validator=schema.newValidator();
           //得到验证的数据源
           Source source=new StreamSource(XMLpath);
           XMLErrorHandler errorHandler = new XMLErrorHandler();
           //开始验证,成功输出success!!!,失败输出fail
           try{
               validator.setErrorHandler(errorHandler);
               validator.validate(source); 
            
           }catch(Exception ex){
            ex.printStackTrace(); 
           }
           
           if(errorHandler.getErrors().hasContent())
           {
               System.out.println("验证失败" + errorHandler.getErrors());
           }
           else
           {
               System.out.println("验证成功");
           }
        }
        catch(Exception e)
        {
            System.out.println("错误信息:" + e);
        }
    }
基于XSD对XML进行验证
原文地址:https://www.cnblogs.com/tengpan-cn/p/4832624.html