📄 dom_test.java
字号:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Vector;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class DOM_test {
Vector employ_Vector=new Vector();//保存员工信息
DocumentBuilderFactory dbf=null;
DocumentBuilder db = null;
Document doc = null;
DOM_test() {
//为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
dbf= DocumentBuilderFactory.newInstance();
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
System.err.println(pce); //出异常时输出异常信息,然后退出,下同
System.exit(1);
}
}
//从info.xml中读取信息生成dom树,将employ对象集合存于Vector中
private void readXMLFile(String inFile) throws Exception {
try {
doc = db.parse(inFile);
} catch (DOMException dom) {
System.err.println(dom.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
System.exit(1);
}
// 下面是解析XML的全过程,比较简单,先取根元素"employs"
Element root = doc.getDocumentElement();
//取"员工"元素列表
NodeList employs = root.getElementsByTagName("employ");
for (int i = 0; i < employs.getLength(); i++) {
//依次取每个"员工"元素
Element employ = (Element) employs.item(i);
//创建一个员工的Bean实例
EmployBean employBean = new EmployBean();
//取员工的性别属性
employBean.setSex(employ.getAttribute("sex"));
/* 注意以下是在employ标签下取得属性,而不是在document范围下,因此
*在此例中NodeList的length是1。xml文档中的空白符也会被作为对象映射在dom树中。
*因而,直接调用node方法的getchildnodes方法
*有时不能够返回所期望的nodelist对象。解决的办法是使用element的
*getelementbytagname(string),然后用item()方法提取想要的元素。
*/
NodeList names = employ.getElementsByTagName("name");
NodeList ages = employ.getElementsByTagName("age");
//将属性值设入employ对象
if (names.getLength() == 1) {
Element e = (Element) names.item(0);
Text t = (Text) e.getFirstChild();
employBean.setName(t.getNodeValue());
}
if (ages.getLength() == 1) {
Element e = (Element) ages.item(0);
Text t = (Text) e.getFirstChild();
employBean.setAge(Integer.parseInt(t.getNodeValue()));
}
employ_Vector.add(employBean);
}
}
//从employ集合的Vector中一一取出对象,构造成XML文档并输出至info_copy.xml
private void writeXMLFile(String outFile) throws Exception {
//为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
doc = db.newDocument();
//下面是建立XML文档内容的过程,先建立根元素"employs"
Element root = doc.createElement("employs");
//根元素添加上文档
doc.appendChild(root);
//取员工信息的Bean列表
for (int i = 0; i < employ_Vector.size(); i++) {
//依次取每个员工的信息
EmployBean employBean = (EmployBean) employ_Vector.get(i);
//建立"员工"元素,添加到根元素
Element employ = doc.createElement("employ");
employ.setAttribute("sex", employBean.getSex());
root.appendChild(employ);
//建立"姓名"元素,设置为员工属性
Element name = doc.createElement("name");
employ.appendChild(name);
Text tName = doc.createTextNode(employBean.getName());
name.appendChild(tName);
/*对element中所包含的text(在dom中,这些text也是代表了一个node的,因此也必须为它们
* 创建相应的node),不能直接用element对象的setnodevalue()方法来设置这些text的内容,
* 而需要用创建的text对象的setnodevalue()方法来设置文本,这样才能够把创建的element和
* 其文本内容添加到dom树中。
*/
Element age = doc.createElement("age");
employ.appendChild(age);
Text tAge = doc
.createTextNode(String.valueOf(employBean.getAge()));
age.appendChild(tAge);
}
/*这里的transformerfactory也同样应用了工厂模式,使得具体的代码同具体的变换器无关。
*transformer类的transfrom方法接受两个参数、一个数据源source和一个输出目标result。
*这里分别使用的是domsource和streamresult,这样就能够把dom的内容输出到一个输出流中,
*当这个输出流是一个文件的时候,dom的内容就被写入到文件中去了
*/
TransformerFactory tfactory =TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
/*这里有一个小技巧,对document对象调用normalize(),可以去掉xml文档中作为格式
*化内容的空白而映射在dom树中的不必要的text node对象。否则你得到的dom树可能
*并不如你所想象的那样。特别是在输出的时候,这个normalize()更为有用。
*/
doc.normalize();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("info_copy.xml"));
transformer.transform(source, result);
}
//最后加入运行的主函数,如下:
public static void main(String[] args) throws Exception {
//建立测试实例
DOM_test dom_test = new DOM_test();
System.out.println("开始读info.xml文件");
dom_test.readXMLFile("info.xml");
System.out.println("读入完毕,开始写info_copy.xml文件");
dom_test.writeXMLFile("info_copy.xml");
System.out.println("写入完成");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -