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


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());

}

}