解析xml有四U方法:DOMQSAXQDOM4jQJDOM. 我们主要学了两种QDOM和SAX. DOM适于解析比较单的XML而SAX则适于解析较复杂的XML文g。各有各的好?br> DOM和SAX的不同: 1. DOM是基于内存的Q不文件有多大Q都会将所有的内容预先装蝲到内存中。从而消耗很大的内存I间。而SAX是基于事件的。当某个事g被触发时Q才获取相应的XML的部分数据,从而不XML文g有多大,都只占用了少量的内存I间?br> 2. DOM可以dXML也可以向XML文g中插入数据,而SAX却只能对XMLq行dQ而不能在文g中插入数据。这也是SAX的一个缺炏V?br> 3.SAX的另一个缺点:DOM我们可以指定要访问的元素q行随机讉KQ而SAX则不行。SAX是从文档开始执行遍历的。ƈ且只能遍历一ơ。也是说我们不能随机的讉KXML文gQ只能从头到XML文g遍历一ơ(当然也可以中间截断遍历)?br> DOM和SAX对XML文g的解析:
1.
在用DOM解析XMLӞ我们首先需要通过DocumentBuilderFactoryq个cdC个工厂的APIQ应用E序能够从XML文档获取
生成对象树的解析器。通过此类?newinstance()
Ҏ我们可以获得此类的一个新实例。然后通过创徏DocumentBuilder的实例其从XML文档中获取DOM文档实例?
DocumentBuilder的实例我们可以通过DocumentBuilderFactorycȝnewDocumentBuilder()Ҏ?
到。之后就通过DocumentBuildercȝparse(InputStream
is)Ҏ给定文件的内容解析Z个XML文档Qƈ且返回一个新的DOM Document 对象。具体步骤如下:
File file = new File("D:\\~码\\xml\\domxml.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); Document dt = db.parse(file); } catch (Exception e) { // TODO 自动生成 catch ?br> e.printStackTrace(); }
q?
时我们就可以开始解析文档了。通过NodeList,Node分别可以得到节点列表和节点了。NodeList可以由Document对象?
getElementsByTagName("元素名称");来得C惛_到的哪个元素的节点列表。由NodeList的item(整Ş参数)Ҏ来得?
节点。通过Node的getFirstChild().getNodeValue()Ҏ可以得到文本节点倹{方法如下:
NodeList nl = dt.getElementsByTagName("star");//starZ个元素名U?br> Node nd = nl.item(0);//得到节点列表 nl 的第一个节炏V?br> 此外我们可以通过循环来取得节点列表中所有的节点?br>当一个元素有子元素时我们可以通过父节点列表取得子节点列表。方法如下:
NodeList nlF = dt.getElementsByTagName("star"); //starZ个元素名U?br>
Node ndF = nl.item(0); //得到节点列表 nl 的第一个节炏V?br> for(int i = 0; i < nlF.getLength(); i ++) { Node ndF = nlF.item(i); //取得元素的所有节?br> NodeList nlC = ndF.getChildNodes(); //取得子元素的节点列表 for(int j = 0; j < nlC.getLength(); j ++) { Node ndC = nlC.item(j); if(ndC.getNodeType()==ndC.ELEMENT_NODE){ String str = ndC.getFirstChild().getNodeValue(); //取得文本节点 System.out.println(str); //打印出文本节?br> } } } } /**
注意*/
׃通过父节点列表得到子节点列表而得到的子元素节点包含了I格所占有的节点,所以这里需要用if(ndC.getNodeType()==
ndC.ELEMENT_NODE)来做判断是否取得的是元素节点QndC.getNodeType()点类型,ndC.ELEMENT_NODE?
点类型ؓ元素节点Q注Q文本节Ҏ元素节点的一个子节点Q)?br> 2. 最常用的SAX解析器是JAXP。JAXP是作为javax.xml包提供的Q包括SAX和DIM的Java接口以及Java XML解析器必L实现的基本接口和cR通过l承DefaultHandlecd现此cL法则可以遍历XML文档Q?br> void startDocument() //接收文档开始的通知 void endDocument() //接收文档l束的通知 void startElement(String uri,String localName,String qName, Attributes attributes) //接收元素开始的通知 void endElement(String uri,String localName, String qName) //接收元素l束的通知 void characters(char[] ch,int start, int length) //接收字符数据的通知
获取SAX解析器的Ҏ和DOM怼。获取SAX解析器的Ҏ如下Q?br> SAXParserFactory spf = SAXParserFactory.newInstance(); //得到工厂的一个新实例 try { SAXParser sp = spf.newSAXParser(); //得到SAXParsercȝ实例 File file = new File("E:\\yuxin_document\\xml\\mytest.xml"); //XML文g
SaxHandle handle = new SaxHandle(); //SaxHandle
q是一个承了DefaultHandle的实CXML遍历
的一个自定义的类 sp.parse(file, handle); //解析一个XML文档 } catch (ParserConfigurationException e) { // TODO 自动生成 catch ?br> e.printStackTrace(); } catch (SAXException e) { // TODO 自动生成 catch ?br> e.printStackTrace(); } catch (IOException e) { // TODO 自动生成 catch ?br> e.printStackTrace(); }
** Z能够清晰的显C出XML中的内容Q我们还需要将解析后取得的内容昄在GUI上。一般用表格来实现?br> SAX和DOM的合?br> 我们可以用SAX来解析XML再用DOM来将解析后的数据写成一个XML文g. 使用DOM创徏一个XML文g的方法如? 首先,需要得C个写入XML文g的Document对象: Document doc = DocumentHelper.createDocument(); 然后可以在q个文档中添加内容了,? Element root = doc.addElement("root"); //写入一个根元素"root" Element el = root.addElement("子元?); //在根元素中写入一个子元素
当将所有信息写入文档后则可以将Document写入XML文g中了,Ҏ如下:
FileWriter file = new FileWriter("D:\\doc.xml"); //得到一个文件输出流对象 document.write(file); //文档内容写入文件中(document是上面所得到的Document 对象) q是一U简单的写入方式 如果你想格式化XML文g则可以这样做:
FileOutputStream fos = new FileOutputStream("D:\\doc.xml"); //
得到一个文件输出流对象 OutputFormat format = OutputFormat.createPrettyPrint(); //得到OutputFormat
格式化类的对?br> XMLWriter xw = new XMLWriter(fos,format); //得到XML输出XMLWriter接口的一
个实?br> xw.write(doc); //文档写入XML fos.close(); //关闭输出?br> xw.close();
|