所有现代浏览器都有读取和操作 XML 的内建 XML 解析器。解析器把 XML 载入内存,然后把它转换为可通过 JavaScript 访问的 XML DOM 对象
解析器读入整个文档,然后构建一个驻留内存的树结构,使用 DOM 接口来操作这个树结构。
优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)
生成Xml文档
解析器通过在内存中建立和XML结构相对应的树状结构数据,使得应用程序可以方便地获得XML文件中的数据。
调用newDocument()可得到一个Document节点
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document= builder.newDocument();
构建Document内容
Element root = this.document.createElement("employees");
this.document.appendChild(root);
Element employe = this.document.createElement("employe");
Element name = this.document.createElement("name");
name.appendChild(this.document.createTextNode("yues"));
Element age = this.document.createElement("age");
age.appendChild(this.document.createTextNode("26"));
Element sex = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("Man"));
employe.appendChild(name);
employe.appendChild(age);
employe.appendChild(sex);
root.appendChild(employe);
使用 Transformer对象将一个Document节点变换为一个XML文件
TransformerFactory transFactory=TransformerFactory. newInstance()
Transformer transformer=transFactory. newTransformer();
将被变换的Document对象封装到一个DOMSource对象中
DOMSource domSource=new DOMSource(document);
将变换得到XML文件对象封装到一个StreamResult对象中
File file=new File("newXML.xml");
FileOutputStream out=new FileOutputStream(file);
StreamResult xmlResult=new StreamResult(out);
对象transformer 调用transform方法实施变换
transformer.transform(domSource, xmlResult);
用于修改Document的常用方法
Node接口是Document的父接口,提供了许多用来修改、增加和删除节点的方法:
Node appendChild(Node newChild) 节点调用该方法可以向当前节点增加一个新的子节点,并返回这个新节点。
Node removeChild(Node oldChild) throws DOMException 节点调用该方法删除参数指定的子节点,并返回被删除的子节点。
Node replaceChild(Node newChild, Node oldChild) 将子节点列表中的子节点 oldChild 替换为 newChild,并返回 oldChild 节点。
解析Xml文档
public void paserXml(String fileName) {
// TODO Auto-generated method stub
try {
this.document = builder.parse(new FileInputStream(new File(fileName)));
NodeList employees = document.getChildNodes();
for(int i=0;i<employees.getLength();i++){
Node employe = employees.item(i);
System.out.println("第"+(i+1)+"个Employee");
NodeList employeAttrs = employe.getChildNodes();
for(int j=0;j<employeAttrs.getLength();j++){
Node employeAttr = employeAttrs.item(j);
NodeList attrInfo = employeAttr.getChildNodes();
for(int k=0;k<attrInfo.getLength();k++){
Node info = attrInfo.item(k);
if(info.getNodeType()==Node.ELEMENT_NODE){
System.out.println(info.getNodeName()+":"+info.getTextContent());
}
}
}
}
} catch (FileNotFoundException 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();
}
}