`
yimeng528
  • 浏览: 189254 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Java自带DOM工具解析XML .

阅读更多

包括三个文件:studentInfo.xml(待解析的xml文件),DomBuilder.java(解析的主要类),TestDomBuilder.java(测试解析的结果),代码分别如下(由于使用csdn blog自带的代码粘贴工具会朝里加入一些"..."字符,虽然利于查看,但是不利于把代码copy出来运行,而亲自运行代码对程序员来说是很重要的,故没有使用csdn blog自带的代码粘贴工具来插入代码,而是用着用直白的方式):

 studentInfo.xml

 <?xml version="1.0" encoding="gb2312"?>
<student>
    <person age="25"><!--如果没有age属性,默认的为20-->
        <name>崔卫兵</name>
        <college>PC学院</college>
        <telephone>62354666</telephone>
        <notes>男,1982年生,硕士,现就读于北京邮电大学</notes>
    </person>
    <person>
        <name>cwb</name>
        <college leader="leader1">PC学院</college><!--如果没有leader属性,默认的为leader-->
        <telephone>62358888</telephone>
        <notes>男,1987年生,硕士,现就读于中国农业大学</notes>
    </person>
    <person age="45">
        <name>xxxxx</name>
        <college leader="">xxx学院</college>
        <telephone>66666666</telephone>
        <notes>注视中,注释中</notes>
    </person>
    <person age="">
        <name>yyyyyy</name>
        <college leader="学院领导">yyyy学院</college>
        <telephone>88888888</telephone>
        <notes>注视中111,注释中222</notes>
    </person>
</student>

 DomBuilder.java

 package domExample;

import java.util.HashMap;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 用java自带的DOM工具实现对xml的编程
 *
 * @author cuiweibing
 * @since 2007.8.9
 */
public class DomBuilder {
 /**
  * 执行具体的解析工作
  * @param filename,待解析的既定格式的xml文件名(相对路径或者决定路径)
  * @param hm      ,HashMap 存放解析后的结果,供后继使用
  */
 /**
  * @param filename
  * @param hm
  */
 public void executeParser(String filename,HashMap<String,String> hm){
  DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();

  try {
   //产生解析实例
   DocumentBuilder dombuilder = domfac.newDocumentBuilder();
   //把XML文件读入放在FileInputStream中,并用其父类InputStream的实例接受
   InputStream is = new FileInputStream(filename);
   //根据输入XML文件流解析成Document结构,供下面遍历与操作使用
   Document doc = dombuilder.parse(is);
   //获取根结点student
   Element root = doc.getDocumentElement();
   NodeList persons = root.getChildNodes();
   //用于记录学生编号的变量
   int num=-1;
   if (persons != null) {
    //遍历所有person节点
    for (int i = 0; i < persons.getLength(); i++) {
     Node person = persons.item(i);
     if (person.getNodeType() == Node.ELEMENT_NODE) {
      num++;
      // 获取person节点的age属性的值
      Node personNode=person.getAttributes().getNamedItem("age");
      if(personNode!=null){
       String age = personNode.getNodeValue();
       if (age != null&&!age.equals("")) {
        hm.put(person.getNodeName() + "-age" + num, age);
       } else {
        hm.put(person.getNodeName() + "-age" + num, "20");
       }
      }else {
       hm.put(person.getNodeName() + "-age" + num, "20");
      }
      //遍历所有person节点的子节点
      for (Node node = person.getFirstChild(); node != null; node = node
        .getNextSibling()) {
       if (node.getNodeType() == Node.ELEMENT_NODE) {
        // 处理person节点的子节点name
        if (node.getNodeName().equals("name")) {
         String name = node.getNodeName();
         //不可用此,dom中也认为<name>崔卫兵</name>中的"崔卫兵"也是节点,而且是name节点的子节点,不同于SAX
         //String name = node.getNodeValue();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
        // 处理person节点的子节点college
        else if (node.getNodeName().equals("college")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
         //获取college节点的leader属性的值
         Node leaderNode=node.getAttributes().getNamedItem("leader");
         if(leaderNode!=null){
          String leader = leaderNode.getNodeValue();
          if (leader != null&&!leader.equals("")) {
           hm.put(node.getNodeName() + "-leader" + num, leader);
          } else {
           hm.put(node.getNodeName() + "-leader" + num, "leader");
          }
         }else {
          hm.put(node.getNodeName() + "-leader" + num, "leader");
         }
        }
        //处理person节点的子节点telephone
        else if (node.getNodeName().equals("telephone")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
        //处理person节点的子节点notes
        else if (node.getNodeName().equals("notes")) {
         String name = node.getNodeName();
         String nameValue = node.getFirstChild().getNodeValue();
         hm.put(name + num, nameValue);
        }
       }
      }
     }
    }
   }
  } catch (ParserConfigurationException e) {
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /**
  * 构造函数
  */
 public DomBuilder() {
 }
}

 TestDomBuilder.java

 package domExample;

import java.util.HashMap;

/**
 * 测试DomBuilder解析的情况
 * @author cuiweibing
 * @since 2007.8.9
 */
public class TestDomBuilder {
 public static void main(String[] args) {
     try{
       //获取解析完后的解析信息
       HashMap<String,String> hashMap = new HashMap<String,String>();
       DomBuilder db=new DomBuilder();
       db.executeParser("studentInfo.xml", hashMap);
       System.out.println("姓名/t年龄/t学院/t学院领导/t电话/t/t备注");
       for(int i=0;i<hashMap.size();i+=6){
         int j=i/6;
         System.out.print(hashMap.get("name"+j)+"/t");
         System.out.print(hashMap.get("person-age"+j)+"/t");
         System.out.print(hashMap.get("college"+j)+"/t");
         System.out.print(hashMap.get("college-leader"+j)+"/t");
         System.out.print(hashMap.get("telephone"+j)+"/t");
         System.out.println(hashMap.get("notes"+j)+"/t");
       }
     }catch(Exception ex){
       ex.printStackTrace();
     }
   }
}

  运行结果

姓名 年龄 学院 学院领导 电话  备注
崔卫兵 25 PC学院 leader 62354666 男,1982年生,硕士,现就读于北京邮电大学 
cwb 20 PC学院 leader1 62358888 男,1987年生,硕士,现就读于中国农业大学 
xxxxx 45 xxx学院 leader 66666666 注视中,注释中 
yyyyyy 20 yyyy学院 学院领导 88888888 注视中111,注释中222 

分享到:
评论

相关推荐

    XML.rar_XML SAX_XML java_dom xml_java xml_java解析xml

    - 创建DOM解析器:使用`javax.xml.parsers.DocumentBuilderFactory`创建解析器工厂,然后通过工厂获取解析器。 - 解析XML文件:调用`parse()`方法解析XML文件,返回一个`Document`对象。 - 访问XML数据:通过`...

    解析XML的四种JAR包jdom.jar、SAX.jar、dom4j.jar、dom.jar

    这里的dom.jar通常指的是Java自带的javax.xml.parsers包中的DOM解析器。Java标准版(JDK)提供了对DOM、SAX和DOM Level 3的内置支持。DOM解析器与JDOM类似,将整个XML文档加载到内存中形成一个树形结构,便于操作,...

    java_rean_writer_xml.rar_JSP读写XML_XML java_java Writer xml_java

    在JSP中,我们可以使用JDK自带的`javax.xml.parsers.DocumentBuilderFactory`和`javax.xml.transform.TransformerFactory`等类来读取和写入XML文件。以下是一个简单的JSP读取XML文件的例子: ```jsp ...

    java在线解析xml

    例如,使用DOM解析XML文件的简单步骤如下: ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import java.io.File; public ...

    JDK自带xml解析器dom+sax

    1. DOM解析XML: DOM解析器将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这种解析方式允许开发者通过节点名称快速访问和修改XML文档的任何部分。在提供的代码示例中,首先创建`DocumentBuilderFactory`...

    JDK自带方法解析xml特定格式的字符串

    本篇文章将详细探讨如何使用JDK自带的方法解析XML特定格式的字符串。 首先,我们需要了解JDK中处理XML的主要API,包括`javax.xml.parsers`包下的`DocumentBuilderFactory`和`DocumentBuilder`,以及`org.w3c.dom`包...

    使用Android自带的XML解析器PULL解析器简单的解析xml

    Android系统提供了一种轻量级的XML解析方式——PULL解析器(Pull Parser),它适用于处理大型XML文档,因为它不需要像DOM解析器那样一次性加载整个XML文档到内存中。PULL解析器通过事件驱动的方式,按需解析XML文档...

    解析xml文件需要的jar包

    Java中常用的解析XML的库有DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。DOM将整个XML文档加载到内存中,形成一个树形结构,适合小型XML文档。SAX是事件驱动的解析器...

    应用源码之比较通用的xml解析方法.zip

    在Android中,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`来实现DOM解析。这种方法的优点是方便操作整个XML结构,但缺点是内存消耗大,不适合处理大型XML文件。 2. SAX解析器...

    Android高级应用源码-Android解析服务端XML.zip

    【Android高级应用源码-Android解析服务端XML.zip】是一个包含Android高级开发示例的压缩包,主要聚焦于如何在Android应用中解析来自服务端的XML数据。Android平台广泛使用XML来传输和处理结构化的数据,例如新闻、...

    java_xml_api,java操作XML文档

    虽然Java自带的XML API已经很强大,但还有许多第三方库如DOM4J和JDOM提供了更高级的功能和更好的性能,开发者可以根据实际需求选择使用。 总结起来,Java XML API提供了全面的XML处理能力,涵盖了从解析到操作再到...

    dom4j创建与解析xml分析与实例

    与Java自带的DOM解析器相比,DOM4J更加灵活和高效,特别是在处理大型XML文档时表现更佳。 #### 二、DOM4J创建XML文档 ##### 1. 创建DOM4J文档对象 首先需要创建一个`Document`对象,这是DOM4J的核心类之一,用于...

    XML.rar_创建xml

    除了Java自带的解析库,还有许多第三方库如JDOM、DOM4J、XMLBeans等,它们提供了更简洁易用的API来处理XML。例如,DOM4J创建XML文件的代码会更简洁: ```java Document document = DocumentHelper.create...

    Android 中解析xml

    以下是使用DOM解析XML的基本步骤: 1. 引入库:在Android项目中,需要导入`javax.xml.parsers`包。 ```java import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; ``` 2....

    xml的快速解析(用第三方jar)

    相比Java自带的DOM解析器,dom4j更轻量级,解析速度更快,且使用起来更为方便。 **1. 添加dom4j依赖** 在项目中使用dom4j之前,首先需要将dom4j的jar文件添加到项目的类路径中。如果你的项目是Maven项目,可以在pom...

    java读取xml文件生成文件

    此外,如果你不希望使用DOM解析,还可以考虑使用SAX(Simple API for XML)或StAX(Streaming API for XML),它们都是更高效且节省内存的解析方式。 在项目中,如果自带的jar包(如mylib下的jar包)提供了额外的...

    PULL解析xml的demo

    XML解析有三种方式 1,DOM 通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据;...Android自带的XML解析器,和SAX基本类似,也是事件驱动,不同的是PULL事件返回的是数值型

    Android网络下的XML解析和生成.

    1. 使用Java的Transformer类:通过javax.xml.transform.TransformerFactory和Transformer接口,可以将XML DOM树转换为字符串或写入到文件。 2. Android的XmlSerializer:提供序列化功能,可以将Java对象转换成XML...

    比较通用的xml解析方法.zip安卓程序项目源码资源下载

    - Pull解析:Android提供的轻量级解析器,类似SAX,通过拉取(Pull)数据的方式解析XML,更适合移动设备资源有限的情况。 3. Java XML解析库: - Apache的XML解析库:如DOM4J、JAXB、Xerces等,提供了更高级的API...

    SAX解析XML

    1. 引入依赖:在项目中引入相应的解析库,如Android SDK自带的`javax.xml.parsers`包。 2. 创建XML文件:XML文件可以存储在项目的资源目录或者外部存储。 3. 编写解析逻辑:实现`DefaultHandler`或自定义`...

Global site tag (gtag.js) - Google Analytics