分享

XML代码-如何使用DOM解析xml,打印xml文档信息工具类

 N_once 2008-01-23

http://blog.csdn.net/l_010204019/archive/2007/08/14/1742694.aspx
学习时仿照书上例子自己练习编写的.加上了很多注释,应该以后的工作学习能用上.也算资料储备吧.

一.使用DOM来解析xml文档.
文件:DepartmentInfo.java,Department.xml.
说明:将xerces2.9的xercesImp.jar导入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文档出现次序的Node集合  
            NodeList nl=dep.getElementsByTagName("department") ;
            
//获得该集合的长度
            int len=nl.getLength();
            
for(int i=0;i<len;i++)
            
{
              
//获取该集合第i个出现的Node对象
              Node nod=nl.item(i);
              
//将起强制转换为其父类Element
              Element elNod=(Element) nod;
              
//这里文本部分为文本节点.必须使用其自身的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>大大发</Zh>
        
<En>BigandRich</En>
    
</depname>
    
<depadress>广州市中山三路</depadress>
    
<depInfo>经营粮油大米食品</depInfo>
    
</department>

二 使用DOM解析器递归遍历DOM节点树 (最近修改 by 07-8-14)
文件:XmlInfoPrint.java,Books.xml.
说明:将xerces2.9的xercesImp.jar导入Project.
              XmlInfoPrint.java (可以作为工具类来使用,打印出xml文档基本信息.可以根据以后项目需要再完善功能)
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)
    
/**
     * 打印元素节点名称以及其值,将不显示非元素文本的文本节点
     
*/

    
{
        
if(node.getNodeName()!="#text"//name="#text"的文本节点不作为输出
        System.out.println(node.getNodeName()+" :" );
        
if(node.getNodeValue()!=null||node.getNodeName()=="#text")
        System.out.println(node.getNodeValue());
    }

    
    
public static void searchNode(Node node)
    
/**
     * 遍历文档所有节点元素,并将其通过pritnInfomation(Node node)来打印出来
     
*/

    
{
        
short type=node.getNodeType();//获取节点元素的类型
        switch (type)
        
{    
        
case Node.PROCESSING_INSTRUCTION_NODE:
            printInfomation(node);
            
break;
        
case Node.ELEMENT_NODE:
            printInfomation(node);
            
//若元素节点有属性节点则将其打印出来
            if(node.hasAttributes())
            
{
                  NamedNodeMap attr
=node.getAttributes();//获取节点的属性节点的集合,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();
        }

    }

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args)
    
{
        
// TODO 自动生成方法存根
        DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
        
try
        
{
            DocumentBuilder db
=dbf.newDocumentBuilder();
            File f
=new File("Books.xml");
            Document book
=db.parse(f);
            XmlInfoPrint.searchNode(book);
        }

        
catch (ParserConfigurationException e)
        
{
            
// TODO 自动生成 catch 块
            e.printStackTrace();
        }

        
catch (SAXException e)
        
{
            
// TODO 自动生成 catch 块
            e.printStackTrace();
        }

        
catch (IOException e)
        
{
            
// TODO 自动生成 catch 块
            e.printStackTrace();
        }


    }


}


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

<books>
    
<book id="0001">
        
<名称>Eclipse从入门到精通(第2版珍藏版)(附盘)</名称>
        
<作者>陈刚</作者>
        
<出版社>清华大学出版社</出版社>
        
<价格>¥46.70</价格>
    
</book>
    
<book id="0002">
        
<名称>Java编程思想(第4版)(中文版)</名称>
        
<作者>(美)Bruce Eckel</作者>
        
<出版社>机械工业出版社</出版社>
        
<价格>¥88.20</价格>
    
</book>
    
<book id="0003">
        
<名称>VC++深入详解(附光盘)/孙鑫作品系列</名称>
        
<作者>孙鑫 余安萍</作者>
        
<出版社>电子工业出版社</出版社>
        
<价格>¥67.70</价格>
    
</book>
    
<book id="0004">
        
<名称>WebWork in Action中文版</名称>
        
<作者>(美)Patrick Lightbody、Jason Carreira</作者>
        
<出版社>电子工业出版社</出版社>
        
<价格>¥35.40</价格>
    
</book>
    
<book id="0005">
        
<名称>
        Java Web开发详解--XML+XSLT+Servlet+JSP深入剖析与实例应用(附光盘)/孙鑫作品系列   
        
</名称>
        
<作者>孙鑫</作者>
        
<出版社>电子工业出版社</出版社>
        
<价格>¥73.90</价格>
    
</book>
    
</books>


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1741467


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多