Java解析XML

Java解析XML

由于需要对XML文件进行操作。所以上网找了一此资料。
用了一下org.w3c.dom解析,不太方便,特别是进行修改时。
后来找到了dom4j这个工具包。方便多了。呵。。记录一下,以后用得着。


首先通过org.w3c.dom解析
InitFromXML.java

package system.init;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


/**
 * @author yymoth
 *
 */
public class InitFromXML {

    private HashMap prop = new HashMap(); //存储从文件中读取的所有配置信息
    private HashMap temp = new HashMap(); //传入的参数,用来生成新的XML配置文件
    private static String xmlFileName ="SystemInit.xml";
    private static String xmlFilePath = InitFromXML.class.getClassLoader().getResource(xmlFileName).getPath();
    
    private static InitFromXML instance = null;
    
    public static synchronized InitFromXML getInstance()
    {
        if(instance == null)
        {    instance = new InitFromXML();    }
        
        return instance;
    }
    
    /**
     * 
     */
    public InitFromXML() {
        super();
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new InitFromXML().getSystemProperty();
        
        HashMap temp = new HashMap();
        temp.put("outputImageDevice","outputImageDeviceVVVVV");
        temp.put("inputSceneFilePath","inputSceneFilePathVVVVV");
        temp.put("fetchIRADFactor",0.11);
        temp.put("fcpr_upLimit",111);
        
        new InitFromXML().updateSystemProperty(temp);
    
    }

    /**
     * 把xml文件读取内容,在内存中产生dom树; 修改它的内容不会影响文件;
     * @return
     */
    public HashMap getSystemProperty()
    {        
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db;
        try {
            db = dbf.newDocumentBuilder();
            System.out.println("开始读取配置文件= " + xmlFilePath);
            Document d = db.parse(xmlFilePath);
            
            NodeList nl = d.getElementsByTagName("outputImageDevice");
            Node mynode = nl.item(0);
            String outputImageDevice = mynode.getFirstChild().getNodeValue();
            prop.put("outputImageDevice",outputImageDevice);
            
            System.out.println("输出路径= "+prop.get("outputImageDevice").toString());
            
            nl = d.getElementsByTagName("inputSceneFilePath");
            mynode = nl.item(0);
            String inputSceneFilePath = mynode.getFirstChild().getNodeValue();
            prop.put("inputSceneFilePath",inputSceneFilePath);
            
            System.out.println("输入场景路径= "+prop.get("inputSceneFilePath"));
            
            
            nl = d.getElementsByTagName("fetchIRADFactor");
            mynode = nl.item(0);
            String fetchIRADFactor= mynode.getFirstChild().getNodeValue();
            prop.put("fetchIRADFactor",fetchIRADFactor);
            
            System.out.println("空闲Render选择因子= "+prop.get("fetchIRADFactor"));
            
            
            nl = d.getElementsByTagName("fcpr_upLimit");
            mynode = nl.item(0);
            int fcpr_upLimit = Integer.parseInt(mynode.getFirstChild().getNodeValue().toString().trim());
            prop.put("fcpr_upLimit",fcpr_upLimit);
            
            System.out.println("单台Render最大渲染帧数= "+prop.get("fcpr_upLimit"));
            
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return this.prop;
    }
    
    
    /**
     * 更新系统参数
     *
     */
    public void updateSystemProperty(HashMap temp)
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = null;
        
        try {
            db = dbf.newDocumentBuilder();
            Document doc = db.parse(xmlFilePath);
            
            
            NodeList nl = doc.getElementsByTagName("outputImageDevice");
            Node mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("outputImageDevice"));
            //mynode.setNodeValue((String)temp.get("outputImageDevice"));
        
            
            nl = doc.getElementsByTagName("inputSceneFilePath");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("inputSceneFilePath"));
        
            nl = doc.getElementsByTagName("fetchIRADFactor");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("fetchIRADFactor"));
            
            nl = doc.getElementsByTagName("fcpr_upLimit");
            mynode = nl.item(0);
            mynode.setTextContent((String)temp.get("fcpr_upLimit"));
            
            
            writeToXML(doc);
            
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    
        
        
        
    }
    
    
    /**
     * 把Document对象生成文件;
     * @param doc
     */
    
    public void writeToXML(Document doc)
    {
        TransformerFactory tfactory = TransformerFactory.newInstance();
        try {
            Transformer tf = tfactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(new File(xmlFilePath));
            tf.transform(source,result);
        } catch (TransformerConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}




下面这个是通过DOM4J, 使用之前要下载dom4j包。官方站点:www.dom4j.org

Dom4j.java


package wcrs_master.test;

/**
 * @author yymoth
 *
 */
import java.io.IOException;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.SAXReader;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.Attribute;

import system.init.InitFromXML;

import java.io.FileWriter;

public class Dom4j {
    private static String xmlFileName ="SystemInit.xml";
    private static String xmlFilePath = Dom4j.class.getClassLoader().getResource(xmlFileName).getPath();
    private static Dom4j instance = null;
    public Dom4j() {
    }

    public static synchronized Dom4j getInstance()
    {
        if(instance == null)
        {    instance = new Dom4j();    }
        
        return instance;
    }
    
    
    
    public Document parse(String sfile) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(sfile));
        return document;
    }

    public void update(HashMap temp) throws IOException {
        Document document = null;
            try {
                document = new Dom4j().parse(xmlFilePath);
                Element root = document.getRootElement(); //得到根节点目录
                Iterator iter = root.elementIterator();
                System.out.println("\r\n****** 获取的数据如下 ******");
                System.out.println(xmlFilePath);
                while (iter.hasNext()) {
                    Element titleElement = (Element) iter.next();
                    // 修改xml元素
                    System.out.print(titleElement.getName()+"  ==  ");
                    System.out.println(titleElement.getData().toString());
                    
                    if (titleElement.getName().equals("outputImageDevice")) {
                        titleElement.setText(temp.get("outputImageDevice").toString());
                    }
                    if (titleElement.getName().equals("fetchIRADFactor")) {
                        titleElement.setText(temp.get("fetchIRADFactor").toString());
                    }
                    if (titleElement.getName().equals("inputSceneFilePath")) {
                        titleElement.setText(temp.get("inputSceneFilePath").toString());
                    }
                    if (titleElement.getName().equals("fcpr_upLimit")) {
                        titleElement.setText(temp.get("fcpr_upLimit").toString());
                    }
                }

            
            } catch (DocumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            writeToXML(document);

    }

    /**
     * 把xml文件读取内容,在内存中产生dom树; 修改它的内容不会影响文件;
     * @return
     */
    public HashMap getSystemProperty()
    {
        HashMap temp = new HashMap();
        Document document ;
        try {
            document = new Dom4j().parse(xmlFilePath);
            Element root = document.getRootElement(); //得到根节点目录
            Iterator iter = root.elementIterator();
            while(iter.hasNext())
            {
                Element titleElement = (Element) iter.next();
                temp.put(titleElement.getName(),titleElement.getData());
            }
            
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return temp;
    }
    
    
    /**
     * 写入文件
     * @param document
     */
    
    public void writeToXML(Document document)
    {
        // 输出全部原始数据,在编译器中显示
        OutputFormat format = OutputFormat.createPrettyPrint();
        XMLWriter writer;
        try {
            writer = new XMLWriter(System.out, format);
            //System.out.println("\r\n------------------Start------------------");
            writer.write(document);  
            //System.out.println("\r\n-------------------End-------------------");
            writer.close();
            // 输出全部原始数据,并用它生成新的我们需要的XML文件
            XMLWriter writer2 = new XMLWriter(new FileWriter(new File(
                    xmlFilePath)), format);
            writer2.write(document); //输出到文件
            writer2.close();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    
    
    
    public static void main(String[] args) {
        
        HashMap temp = new HashMap();
        
        temp.put("outputImageDevice","outputImageDeviceVVVVV");
        temp.put("inputSceneFilePath","inputSceneFilePathVVVVV");
        temp.put("fetchIRADFactor",0.11);
        temp.put("fcpr_upLimit",11);
        
        Dom4j dom4j = new Dom4j();
        try {
            dom4j.update(temp);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

你可能感兴趣的:(解析xml)