XML的四种解析方式之DOM
1.DOM XML解析的主要作用:可以使用DOM读取或者输出XML文件。 所有的XML文件都是由节点保存内容的,所谓的解析操作指的就是从指定的节点之中将内容读取进来。
在XML文件中由于更多的是描述信息的内容,所以在得到一个XML文档之后应该利用程序按照里面元素的定义名称取出对应的内容,这样的操作就称为XML解析,在XML解析中W3C定义了SAX和DOM两种解析方式。
JavaScript中的解析操作主要以DOM为主。
DOM(DocumentObjectModel,文档对象模型),在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对这个对象模型的操作,来实现对XML文档数据的操作。
Dom_01.xml的内容如下: <?xmlversion="1.0"encoding="GBK"standalone="no"?> <addresslist> <linkman> <name>李兴华</name> <email>mldnqa@163.com</email> </linkman> <linkman> <name>MLDN</name> <email>mldnkf@163.com</email> </linkman> </addresslist> 该文件对应的DOM树如下:
每个文字区域也称为一个节点称为文字节点。 DOM解析过程
Dom02.xml的内容如下: <?xmlversion="1.0"encoding="GBK"standalone="no"?> <addresslist> <name>李兴华</name> </addresslist> 通过程序对该文件进行解析。【需要java帮助文档】。DOMDemo.java的内容如下: packageorg.skewrain.xml.dom; importjava.io.*; importorg.w3c.dom.*; importjavax.xml.parsers.*; publicclassDOMDemo{ publicstaticvoidmain(Stringargs[])throwsException{ //取得DocumentBuilderFactory类的对象 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //取得DocumentBuilder类的对象 DocumentBuilderbuild=factory.newDocumentBuilder(); Documentdoc=build.parse(newFile("D:"+File.separator+"dom_02.xml")); NodeListnl=doc.getElementsByTagName("name"); //输出节点 System.out.println("姓名:"+nl.item(0).getFirstChild().getNodeValue()); } } 在cmd中以此运行: Javac-d.DOMDemo.java Javaorg.skewrain.xml.dom.DOMDemo 运行结果为:
Dom_03.xml的内容如下: <?xmlversion="1.0"encoding="GBK"standalone="no"?> <addresslist> <linkman> <name>斜雨</name> <email>skewrain@foxmail.com</email> </linkman> <linkman> <name>skewrain</name> <email>skewrain@foxmail.com</email> </linkman> </addresslist> 通过程序对该文件进行解析。
DOMDemo2.java的内容如下: packageorg.skewrain.xml.dom; importjava.io.*; importorg.w3c.dom.*; importjavax.xml.parsers.*; publicclassDOMDemo2{ publicstaticvoidmain(Stringargs[])throwsException{ //取得DocumentBuilderFactory类的对象 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //取得DocumentBuilder类的对象 DocumentBuilderbuild=factory.newDocumentBuilder(); Documentdoc=build.parse(newFile("D:"+File.separator+"dom_03.xml")); //得到所有的linkman节点 NodeListnl=doc.getElementsByTagName("linkman"); for(intx=0;x<nl.getLength();x++){ Elemente=(Element)nl.item(x);//取出每一个元素 System.out.println("姓 名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println("邮 箱:"+e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue()); } } }
在cmd中分别执行:cdd: Javac-d.DOMDemo2.java Javaorg.skewrain.xml.dom.DOMDemo2 执行结果如下:
DOM操作除了可以进行解析之外,也可以进行文件的生成。 如果要想生成XML文件,则在创建文档的时候,就应该使用的是newDocument();。 现在我们想生成一个XML格式的文档。 <?xmlversion=”1.0”encoding=”GBK”?> <addresslist> <linkman> <name>斜雨-北风</.name> <email>skewrain@foxmail.com</email> </linkman> </addresslist>
在DOMDemo3.java代码中的内容为: packageorg.skewrain.xml.dom; importjava.io.*; importorg.w3c.dom.*; importjavax.xml.parsers.*; publicclassDOMDemo3{ publicstaticvoidmain(Stringargs[])throwsException{ //取得DocumentBuilderFactory类的对象 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //取得DocumentBuilder类的对象 DocumentBuilderbuild=factory.newDocumentBuilder(); Documentdoc=build.newDocument();//创建一个新的XML文档。 Elementaddresslist=doc.createElement("addresslist"); Elementlinkman=doc.createElement("linkman"); Elementname=doc.createElement("name"); Elementemail=doc.createElement("email"); //设置节点内容 name.appendChild(doc.createTextNode("斜雨-北风")); email.appendChild(doc.createTextNode("skewrain@foxmail.com")); //设置各个节点的关系 linkman.appendChild(name);//name是linkman的子节点 linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); //得到所有的linkman节点 NodeListnl=doc.getElementsByTagName("linkman"); for(intx=0;x<nl.getLength();x++){ Elemente=(Element)nl.item(x);//取出每一个元素 System.out.println("姓 名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println("邮 箱:"+e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue()); } } } 运行的结果为:
DOM的难点在于将文档的内容输出保存到文件中。下面的代码的作用是将文档的内容输出到新生成的文件中。 packageorg.skewrain.xml.dom; importjava.io.*; importorg.w3c.dom.*; importjavax.xml.parsers.*; importjavax.xml.transform.*; importjavax.xml.transform.dom.*; importjavax.xml.transform.stream.*; publicclassDOMDemo3{ publicstaticvoidmain(Stringargs[])throwsException{ //取得DocumentBuilderFactory类的对象 DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance(); //取得DocumentBuilder类的对象 DocumentBuilderbuild=factory.newDocumentBuilder(); Documentdoc=build.newDocument();//创建一个新的XML文档。 Elementaddresslist=doc.createElement("addresslist"); Elementlinkman=doc.createElement("linkman"); Elementname=doc.createElement("name"); Elementemail=doc.createElement("email"); //设置节点内容 name.appendChild(doc.createTextNode("斜雨-北风")); email.appendChild(doc.createTextNode("skewrain@foxmail.com")); //设置各个节点的关系 linkman.appendChild(name);//name是linkman的子节点 linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); TransformerFactorytf=TransformerFactory.newInstance(); Transformert=tf.newTransformer(); t.setOutputProperty(OutputKeys.ENCODING,"GBK");//处理中文 DOMSourcesource=newDOMSource(doc);//准备输出文档 StreamResultresult=newStreamResult(newFile("d:"+File.separator+"output.xml")); t.transform(source,result); //得到所有的linkman节点 NodeListnl=doc.getElementsByTagName("linkman"); for(intx=0;x<nl.getLength();x++){ Elemente=(Element)nl.item(x);//取出每一个元素 System.out.println("姓 名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()); System.out.println("邮 箱:"+e.getElementsByTagName("email").item(0).getFirstChild().getNodeValue()); } } } 在编译运行之后,可以发现新生成了一个output.xml的文件,文件的内容如下: <?xmlversion="1.0"encoding="GBK"standalone="no"?><addresslist><linkman><name>斜雨-北风</name><email>skewrain@foxmail.com</email></linkman></addresslist> 通过以上的例子,我们可以看出,DOM可以实现文件的读取及修改操作,但使用的更多的是读取操作。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |