The Classical Example using DOM to operate a XML File

来源:互联网 发布:mac地址手机怎么进入 编辑:程序博客网 时间:2024/05/21 19:37
import java.io.File;import java.io.FileWriter;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;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;public class TestDom {    public final static String REDUNDANTFILE = "D:/oJobProgress.xml";private static DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();public static final String Job_Name_Tag="name" ;public static final String Job_Progress_Tag = "JobProgress";public static final String Job_Status_Tag="Status" ;public static final String Job_One_Tag = "Job";public static void main(String args[]){startOneJob("oneTwo");}public static void startOneJob(String jobName){try {DocumentBuilder db  = dbf.newDocumentBuilder();File file = new File(REDUNDANTFILE);Document dom=null;if(!file.exists()){dom = db.newDocument();dom.setXmlVersion("1.0");dom.setXmlStandalone(false);}else{dom = db.parse(file);}Element oneJobE=findSpecJobE(db, file, dom, jobName);setOrUpdateStatus(dom,oneJobE,"Runing");printFile(file, dom);} catch (ParserConfigurationException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}catch (SAXException e) {e.printStackTrace();}}   /** * find or create a OneJob Element to the JobProgress element *  * @param file * @param dom * @param jobName * @return * @throws IOException  */private static Element findSpecJobE(DocumentBuilder db, File file, Document dom, String jobName) throws IOException{Element oneJobE =null;boolean existedJob=false;NodeList nodeListTemp = dom.getElementsByTagName(Job_One_Tag);//Jobif (nodeListTemp != null && nodeListTemp.getLength() > 0) {for (int i = 0; i < nodeListTemp.getLength(); i++) {Node serverI = nodeListTemp.item(i);if (serverI.getNodeType() == Node.ELEMENT_NODE) {String jobNameI = ((Element) serverI).getAttribute(Job_Name_Tag);if (jobNameI.equals(jobName)) {existedJob = true;oneJobE =(Element) serverI;}else{dom.removeChild(serverI);}}}} if(!existedJob){Element rootE =null;nodeListTemp = dom.getElementsByTagName(Job_Progress_Tag);if (nodeListTemp != null && nodeListTemp.getLength() > 0) {rootE = ((Element) nodeListTemp.item(0));} else {rootE = dom.createElement(Job_Progress_Tag);dom.appendChild(rootE);//create the root }oneJobE = dom.createElement(Job_One_Tag);oneJobE.setAttribute(Job_Name_Tag,jobName);rootE.appendChild(oneJobE);}return oneJobE;}/** * change or create one Job Status Elment to the OneJobElment * @param dom * @param oneJobE * @param newStatus */private static void setOrUpdateStatus(Document dom, Element oneJobE,String newStatus){Element elmStatus;boolean statusExisted=false;NodeList nodeListTemp  = oneJobE.getElementsByTagName(Job_Status_Tag);if (nodeListTemp != null && nodeListTemp.getLength() > 0) {elmStatus = ((Element) nodeListTemp.item(0));if (elmStatus != null) {statusExisted=true;elmStatus.setTextContent(newStatus);}} if(!statusExisted) {elmStatus = dom.createElement(Job_Status_Tag);elmStatus.setTextContent(newStatus);oneJobE.appendChild(elmStatus);}}      private static void printFile(File file, Document dom) throws IOException, TransformerException {StreamResult streamResult;file.getParentFile().mkdirs();FileWriter fw = new FileWriter(file);streamResult = new StreamResult(fw);try {TransformerFactory tf = TransformerFactory.newInstance();tf.setAttribute("indent-number", new Integer(4));Transformer serializer = tf.newTransformer();serializer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");//serializer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "users.dtd");serializer.setOutputProperty(OutputKeys.INDENT, "yes");serializer.transform(new DOMSource(dom), streamResult);} finally {fw.flush();fw.close();}}}

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><JobProgress>    <Job name="OneTwo">        <Status>Running</Status>    </Job></JobProgress>