电竞比分网-中国电竞赛事及体育赛事平台

分享

XML代碼-如何使用DOM解析xml,打印xml文檔信息工具類

 N_once 2008-01-23

http://blog.csdn.net/l_010204019/archive/2007/08/14/1742694.aspx
學(xué)習(xí)時仿照書上例子自己練習(xí)編寫的.加上了很多注釋,應(yīng)該以后的工作學(xué)習(xí)能用上.也算資料儲備吧.

一.使用DOM來解析xml文檔.
文件:DepartmentInfo.java,Department.xml.
說明:將xerces2.9的xercesImp.jar導(dǎo)入Project.

DepartmentInfo.java
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.*;
import org.xml.sax.SAXException;


public class DepartmentInfo
{
    
public static void main(String [] args)
    
{
        
//獲得一個工廠類的實例
        DocumentBuilderFactory bdf =DocumentBuilderFactory.newInstance();
        
try
        
{
            
//獲得解析器封裝的DOM解析器
            DocumentBuilder db=bdf.newDocumentBuilder();
            
//指定要分析的xml文檔
            File f=new File("Department.xml");
            
//獲得xml文檔的對象
            Document dep=db.parse(f);
              System.out.println( dep.getDocumentElement().getTagName());
            
//**************以上步驟是所有使用DOM解析xml文檔所必須的3步驟************//  
            
            
//這里是獲得所有dep下的所有名為deopartment,并且按照在xml文檔出現(xiàn)次序的Node集合  
            NodeList nl=dep.getElementsByTagName("department") ;
            
//獲得該集合的長度
            int len=nl.getLength();
            
for(int i=0;i<len;i++)
            
{
              
//獲取該集合第i個出現(xiàn)的Node對象
              Node nod=nl.item(i);
              
//將起強制轉(zhuǎn)換為其父類Element
              Element elNod=(Element) nod;
              
//這里文本部分為文本節(jié)點.必須使用其自身的getNodeValue()方法才能返回值
              String depname=elNod.getElementsByTagName("Zh").item(0).getChildNodes().item(0).getNodeValue();
              String depadress
=elNod.getElementsByTagName("depadress").item(0).getChildNodes().item(0).getNodeValue();
              String depInfo
=elNod.getElementsByTagName("depInfo").item(0).getChildNodes().item(0).getNodeValue();
              
              
              
//**********以下是打印格式*****************************************///
              System.out.print("部門名稱:"+depname);
              System.out.println(
"  "+elNod.getElementsByTagName("En").item(0).getChildNodes().item(0).getNodeValue());
              System.out.println(
"部門所在地:"+depadress);
              System.out.println(
"部門信息:"+depInfo);
              System.out.println(
"------------------------------------------------");
              
              
            }

        }

        
catch (ParserConfigurationException e)
        
{
            
// TODO 自動生成 catch 塊
            e.printStackTrace();
        }

        
catch (SAXException e)
        
{
            
// TODO 自動生成 catch 塊
            e.printStackTrace();
        }

        
catch (IOException e)
        
{
            
// TODO 自動生成 catch 塊
            e.printStackTrace();
        }

        
    }


}


Department.xml
<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type="text/xsl" href="Department.xsl"?>

<department>
    
<depname>
        
<Zh>大大發(fā)</Zh>
        
<En>BigandRich</En>
    
</depname>
    
<depadress>廣州市中山三路</depadress>
    
<depInfo>經(jīng)營糧油大米食品</depInfo>
    
</department>

二 使用DOM解析器遞歸遍歷DOM節(jié)點樹 (最近修改 by 07-8-14)
文件:XmlInfoPrint.java,Books.xml.
說明:將xerces2.9的xercesImp.jar導(dǎo)入Project.
              XmlInfoPrint.java (可以作為工具類來使用,打印出xml文檔基本信息.可以根據(jù)以后項目需要再完善功能)
import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.*;
import org.xml.sax.SAXException;



public class XmlInfoPrint
{
    
public static void printInfomation(Node node)
    
/**
     * 打印元素節(jié)點名稱以及其值,將不顯示非元素文本的文本節(jié)點
     
*/

    
{
        
if(node.getNodeName()!="#text"//name="#text"的文本節(jié)點不作為輸出
        System.out.println(node.getNodeName()+" :" );
        
if(node.getNodeValue()!=null||node.getNodeName()=="#text")
        System.out.println(node.getNodeValue());
    }

    
    
public static void searchNode(Node node)
    
/**
     * 遍歷文檔所有節(jié)點元素,并將其通過pritnInfomation(Node node)來打印出來
     
*/

    
{
        
short type=node.getNodeType();//獲取節(jié)點元素的類型
        switch (type)
        
{    
        
case Node.PROCESSING_INSTRUCTION_NODE:
            printInfomation(node);
            
break;
        
case Node.ELEMENT_NODE:
            printInfomation(node);
            
//若元素節(jié)點有屬性節(jié)點則將其打印出來
            if(node.hasAttributes())
            
{
                  NamedNodeMap attr
=node.getAttributes();//獲取節(jié)點的屬性節(jié)點的集合,NamedNodeMap是live的
                  int len=attr.getLength();
                  
for(int i=0;i<len;i++)
                  
{
                      System.out.print(
"ID="+attr.item(i).getNodeValue());
                  }

                      
            }

            
            
break;
        
case Node.TEXT_NODE:
            printInfomation(node);
            
break;
            
        
default:
            
break;
        }

        Node child
=node.getFirstChild();
        
while(child!=null)
        
{
            searchNode(child);
            child
=child.getNextSibling();
        }

    }

    
/**