新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     >>W3CHINA.ORG讨论区<<     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] W3CHINA.ORG讨论区 - 语义网·描述逻辑·本体·RDF·OWLXML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → XML编程研究 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2227 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: XML编程研究 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 XML编程研究


    --------------------------------------------------------------------------------


    基于事件驱动的解析接口SAX (实例一)
      SAX vs. DOM
      DOM是基于树结构的一种接口;SAX是基于事件驱动的解析接口。
      有什么区别呢?
      1、SAX 可以解析任意大小的文件,而DOM 解析的文件大小则和硬件有关。DOM 需要将整个文件加载到内存,而SAX 不需要。
      2、因为SAX 是不把文件加载到内存,所以不能对文档进行随机存取;而DOM 可以做到。
      3、SAX 相对DOM 来说是简单易用。
      4、如果要从文档的简单系列中获取信息,SAX 是最快的方法。
      实例一、查查有多少本书?
      题目是要查出来下面的XML 文件books.xml 里有多少本书。
      <?xml version="1.0"?>
      <books>
      <book category="Programming">
      <author>XXX1</author>
      <title>Thinking in Java</title>
      <price unit="RMB">60.00</price>
      </book>
      <book category="Programming">
      <author>XXX2</author>
      <title>Thinking in C++</title>
      <price>56.00</price>
      </book>
      <book category="fiction">
      <author>Slepwormzz</author>
      <title>My Dirty Mind</title>
      <price>8.99</price>
      </book>
      </books>
      下面的代码使用了SUN 的JAXP 包,请在http://java.sun.com/xml/download.html 下载。
      在Jbuilder4 中运行正确。
      Import org.xml.sax.*;
      import javax.xml.parsers.*;
      import java.io.IOException;
      /**
      * Title: XML Study, Sample 1
      * Description: Count My books.
      * Copyright: Copyright ? 2001
      * Company: Isolation Land.
      * @author Slepworm
      * @version 1.0
      */
      public class BookCounter extends org.xml.sax.helpers.DefaultHandler{
      private int count = 0; // 定义一个计数器
      public BookCounter() {
      }
      // 主程序
      public void countBooks() throws Exception {
      // 创建一个新的JAXP 的SAXParserFactory 实例,并且配置它。在JAXP 包的例子中可以看到此种方法
      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setValidating(false); // 试一下改为true
      XMLReader xr = null;
      try {
      SAXParser sp = spf.newSAXParser();
      xr = sp.getXMLReader();
      } catch (Exception e) {
      System.err.print(e);
      System.exit(1);
      }
      xr.setContentHandler(this);
      try {
      xr.parse("http://localhost/books.xml"); //进行语法分析
      } catch (SAXException se) {
      System.err.println(se.getMessage());
      System.exit(1);
      } catch (IOException ioe) {
      System.err.println(ioe);
      System.exit(1);
      }
      }
      // 当每次碰到一个book 元素的时候,将计数器加一。此方法在遇到第一个元素的时候开始执行
      public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if (rawName.equals("book"))
      count++;
      }
      // 输出计数器。此方法在分析文档完成的时候执行
      public void endDocument() throws SAXException {
      System.out.print(count);
      }
      public static void main(String[] args) throws Exception {
      BookCounter bc = new BookCounter();
      bc.countBooks();
      }
      }
      我们可以看到输出了结果为3
      试着把books.xml 文件改成错误的结构,看看会有什么例外抛出。
      于事件驱动的解析接口SAX (实例二)
      实例二、查查看我的书架中有多少本小说书(获取元素的属性值)
      题目是要查出来下面的XML 文件books.xml 里有多少本小说。
      <?xml version="1.0" encoding="gb2312"?>
      <书架>
      <书类别="参考书">
      <著者>谭浩强</著者>
      <书名>学习C</书名>
      <价格>20.00</价格>
      </书>
      <书类别="小说">
      <著者>吴承恩</著者>
      <书名>西游记</书名>
      <价格>120.56</价格>
      </书>
      <书类别="小说">
      <著者>曹雪芹</著者>
      <书名>红楼梦</书名>
      <价格>208.99</价格>
      </书>
      <书类别="小说">
      <著者>睡虫</著者>
      <书名>下月出版</书名>
      <价格>0.00</价格>
      </书>
      </书架>
      下面的代码使用了SUN 的JAXP 包,请在http://java.sun.com/xml/download.html 下载。
      在Jbuilder4 中运行正确。请注意将要分析的xml 文件放在http://localhost/books.xml 或者更改此URI
      import org.xml.sax.*;
      import javax.xml.parsers.*;
      /**
      * Title: XML Study, Sample 2
      * Description: Count fictions in my shelf.
      * Copyright: Copyright ? 2001
      * Company: Isolation Land.
      * @author Slepworm
      * @version 1.0
      */
      public class GetAtts extends org.xml.sax.helpers.DefaultHandler{
      private int count = 0; // 定义一个计数器
      private boolean isFiction;
      public GetAtts() {
      }
      // 创建一个新的JAXP 的SAXParserFactory 实例,并且配置它。
      Public void createParser() throws Exception {
      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setValidating(false);
      SAXParser sp = spf.newSAXParser();
      XMLReader xr = sp.getXMLReader();
      xr.setContentHandler(this);
      xr.parse("http://localhost/books.xml");
      }
      // 当每次碰到一个book 元素的时候,将计数器加一。此方法在遇到第一个元素的时候开始执行
      public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if (rawName.equals("书")) {
      String category = atts.getValue("类别"); ///**** 获取类别的值
      System.out.println(category); //打印类别的值
      isFiction = (category != null && category.equals("小说")); //如果类别的值为小说则将计数器加一。
      If (isFiction) count++;
      }
      }
      // 输出计数器。此方法在分析文档完成的时候执行
      public void endDocument() throws SAXException {
      System.out.print(count);
      }
      public static void main(String[] args) throws Exception {
      BookCounter ga = new GetAtts();
      ga.createParser();
      }
      }
      输出结果为
      参考书
      小说
      小说
      小说
      3
      基于事件驱动的解析接口SAX (实例三)
      实例三、计算订单的总价格(如何取出正文的值)。
      问题:请计算orders.xml 所示的总价格
      orders.xml 的源文件。
      <?xml version="1.0" encoding="gb2312"?>
      <订单>
      <商品数量="21">
      <名称>袜子</名称>
      <单价>3.24</单价>
      </商品>
      <商品数量="1">
      <名称>贝斯</名称>
      <单价>4200.00</单价>
      </商品>
      <商品数量="5">
      <名称>域名</名称>
      <单价>60.50</单价>
      </商品>
      <商品数量="2">
      <名称>书</名称>
      <单价>99.00</单价>
      </商品>
      </订单>
      下面的代码使用了SUN 的JAXP 包,请在http://java.sun.com/xml/download.html 下载。
      在Jbuilder4 中运行正确。
      Import org.xml.sax.*;
      import javax.xml.parsers.*;
      import java.util.Vector;
      /**
      * Title: XML Study, Sample 3
      * Description: Count the Order Sum.
      * Copyright: Copyright ? 2001
      * Company: Isolation Land.
      * @author Slepworm
      * @version 1.0
      */
      public class CountSum extends org.xml.sax.helpers.DefaultHandler {
      private double totalPrice = 0.00;
      private StringBuffer content = new StringBuffer();
      private Vector numberV = new Vector();
      private Vector priceV = new Vector();
      private double totalSum = 0.00;
      public CountSum() {
      }
      public static void main(String[] args) throws Exception {
      CountSum cs = new CountSum();
      cs.createParser();
      }
      public void createParser() throws Exception{
      SAXParserFactory spf = SAXParserFactory.newInstance();
      spf.setValidating(false);
      SAXParser sp = spf.newSAXParser();
      XMLReader xr = sp.getXMLReader();
      xr.setContentHandler(this);
      xr.parse("http://localhost/orders.xml");
      }
      // 取得商品中属性数量的值,并将它放入数组numberV 中。
      Public void startElement(String namespaceURI, String localName, String rawName, Attributes atts) throws SAXException {
      if (rawName.equals("商品")) {
      String number = atts.getValue("数量");
      numberV.addElement(number);
      //System.out.println(numberV);
      }
      content.setLength(0);
      }
      // **** 此方法将遍历XML 文件,获取文本值。
      Public void characters(char[] ch, int start, int length) throws SAXException {
      content.append(ch, start, length);
      //System.out.println(content.toString()); // 打印出来,看看此方法是怎样运行的
      }
      // **** 仅获取元素单价中的文本,并将它放入数组priceV 中。
      Public void endElement(String uri, String localName, String qName) throws SAXException {
      if (localName.equals("单价")) {
      String price = content.toString();
      priceV.addElement(price);
      //System.out.println(priceV);
      }
      }
      // 计算总价格
      public void endDocument() throws SAXException {
      int num;
      double pr;
      for (int I=0; I<numberV.size();I++){
      num = Integer.valueOf(numberV.get(I).toString()).intValue();
      pr = new Double(priceV.get(I).toString()).doubleValue();
      totalSum += pr*num;
      }
      System.out.println("订单的总价格是" + totalSum);
      }
      }
      输出结果:
      订单的总价格是4768.54(完)

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/8/19 10:14:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/26 21:18:03

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms