使用Java自带SAX工具解析XML

 

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>
</student>

 

SAXHandler.java

package saxExample;

import java.util.HashMap;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

/**
 * 继承DefaultHandler类,用SAX实现对xml的遍历
 * @author cuiweibing
 * @since 2007.8.8
 */


public class SAXHandler
    extends DefaultHandler {
  //存放所有的节点(这里的节点等于原来的节点+编号)以及它所对应的值
  private HashMap<String,String> hashMap = new HashMap<String,String>();
  //目前的节点
  private String currentElement = null;
  //目前节点所对应的值
  private String currentValue = null;
  //用于节点编号(具体到person)
  private static int i=-1;
 
  public HashMap getHashMap() {
    return hashMap;
  }
 
  public void characters(char[] ch, int start, int length) throws SAXException {
    //取出目前节点对应的值
    currentValue = new String(ch, start, length);
  }
 
  public void startElement(String uri, String localName, String qName,
                           Attributes attr) throws SAXException {
    if(qName.equalsIgnoreCase("student")){
      //currentElement= "";
    }else if (qName.equalsIgnoreCase("person")){
      i++;
      //currentElement= "";
      String age=attr.getValue("age");
      if(age!=null){
       hashMap.put(qName+"-age"+i, age);
      }else{
       hashMap.put(qName+"-age"+i, "20");
      }
    }else if (qName.equalsIgnoreCase("college")){
        currentElement= qName;
        String leader=attr.getValue("leader");
        if(leader!=null){
         hashMap.put(qName+"-leader"+i, leader);
        }else{
         hashMap.put(qName+"-leader"+i, "leader");
        }
    }else{
      currentElement= qName;
    }
 
  }
 
  public void endElement(String uri, String localName, String qName) throws SAXException {
    if (qName.equalsIgnoreCase("student")){
//      hashMap.put(currentElement, currentValue);
    }else if (qName.equalsIgnoreCase("person")){
 
    }else{
      currentElement+=i;
      hashMap.put(currentElement, currentValue);
    }
  }

TestSAXHandler.java

package saxExample;

import java.io.File;
import java.util.HashMap;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;

/**
 * 解析主类
 * @author cuiweibing
 * @since 2007.8.8
 */


public class TestSAXHandler {
  public TestSAXHandler() {
  }

  public static void main(String[] args) {
    try{
      //初始化与解析
      SAXHandler handler = new SAXHandler();
      SAXParserFactory saxparserfactory = SAXParserFactory.newInstance();
      SAXParser saxparser = saxparserfactory.newSAXParser();
      saxparser.parse(new File("studentInfo.xml"), handler);

      //解析完后获取解析信息
      HashMap hashMap = handler.getHashMap();
      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();
    }
  }
}

要在Java解析中文XML文件,可以使用Java自带的DOM和SAX解析器。下面是使用DOM解析中文XML文件的示例代码: ``` import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import java.io.File; public class ParseXML { public static void main(String argv[]) { try { File fXmlFile = new File("file.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(fXmlFile); doc.getDocumentElement().normalize(); System.out.println("Root element :" + doc.getDocumentElement().getNodeName()); NodeList nList = doc.getElementsByTagName("student"); System.out.println("-----------------------"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); System.out.println("\nCurrent Element :" + nNode.getNodeName()); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Student roll no : " + eElement.getAttribute("rollno")); System.out.println("First Name : " + eElement.getElementsByTagName("firstname").item(0).getTextContent()); System.out.println("Last Name : " + eElement.getElementsByTagName("lastname").item(0).getTextContent()); System.out.println("Nick Name : " + eElement.getElementsByTagName("nickname").item(0).getTextContent()); System.out.println("Marks : " + eElement.getElementsByTagName("marks").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 该示例代码使用DOM解析解析一个名为file.xmlXML文件,该文件包含学生信息。在输出结果中,可以看到解析器正确地提取了中文信息,例如学生的名字和姓氏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值