楼主: fry_2006

sax解析xml文档

[复制链接]
论坛徽章:
1
2009新春纪念徽章
日期:2009-01-04 14:52:28
11#
发表于 2008-11-21 22:18 | 只看该作者
DOM 是要把全部的 xml 数据读到 memory 里,创建成树形结构后,才能解析。当数据太多太大时,就不能用 DOM 因为那样就很可能会 out of memory 了,即使没有,也会占用很多的内存(终于想起了,memory 叫内存,对不对?),效率也不高。所以当数据过大时,最好是(或者只能)用 SAX。SAX是读进 stream (数据流?),边读边解析,所以效率高,占用的 memory 也少。就是麻烦点。

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2008-11-23 10:37 | 只看该作者
比如这个XML文档:
<bib>
  <paper>
        <name>"张三"</name>
        <public>"清华大学出版社"</public>
        <time>"2005"</time>
   </paper>
<book>
      <name>"数据结构"</name>
      <author>"wuweimin"</author>
      </book>
</bib>

在利用XPath表达式查询这个文档的时候,假设我要查询得是bib/book:
如果解析到paper元素这,paper元素不满足查询,很明显我们知道paper得子元素也不满足,这时候我就跳过paper得所有子节点,继续解析后面得节点book节点。
这个跳的过程,首先需要知道paper元素得开始位置和结束位置,就是这个位置我不知道怎么得到。在一个就是JAVA中,我不知道怎么实现跳过这个动作得。因为查询匹配得过程是在
sax解析得startelement解析事件的时候处理得,所以跳过skip()这个函数不知道怎么引入。

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
13#
发表于 2008-11-23 10:48 | 只看该作者
把不要的节点先去掉呢

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2008-11-23 10:49 | 只看该作者

回复 #10 justforregister 的帖子

比如这个XML文档:
<bib>
  <paper>
        <name>"张三"</name>
        <public>"清华大学出版社"</public>
        <time>"2005"</time>
   </paper>
<book>
      <name>"数据结构"</name>
      <author>"wuweimin"</author>
      </book>
</bib>

在利用XPath表达式查询这个文档的时候,假设我要查询得是bib/book:
如果解析到paper元素这,paper元素不满足查询,很明显我们知道paper得子元素也不满足,这时候我就跳过paper得所有子节点,继续解析后面得节点book节点。
这个跳的过程,首先需要知道paper元素得开始位置和结束位置,就是这个位置我不知道怎么得到。在一个就是JAVA中,我不知道怎么实现跳过这个动作得。因为查询匹配得过程是在
sax解析得startelement解析事件的时候处理得,所以跳过skip()这个函数不知道怎么引入。

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2008-11-23 10:51 | 只看该作者

回复 #13 justforregister 的帖子

根据查询表达式,查询得过程中才知道需不需要。得经过判断之后才知道满不满足查询

使用道具 举报

回复
论坛徽章:
1
2009新春纪念徽章
日期:2009-01-04 14:52:28
16#
发表于 2008-11-23 10:51 | 只看该作者
不是有 startElement 和 endElement 的 event 吗?

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2008-11-23 11:05 | 只看该作者

回复 #16 hongjinusa 的帖子

是,就是在startelement事件中处理查询的

使用道具 举报

回复
论坛徽章:
0
18#
 楼主| 发表于 2008-11-23 11:07 | 只看该作者
对了,我再问你一个问题,就是我在写程序得时候。
一个类A调用类B的对象怎么写?
比如B类里有:栈对象stack(),栈里存放元素。列表对象list(),也存放元素。
我在A类里面写成b.stack()和b.list(),对象能调用了,但是原来的元素值却没有过去。

使用道具 举报

回复
论坛徽章:
1
2009新春纪念徽章
日期:2009-01-04 14:52:28
19#
发表于 2008-11-23 13:51 | 只看该作者
fry_2006,是问我吗?
对了,我再问你一个问题,就是我在写程序得时候。
一个类A调用类B的对象怎么写?
比如B类里有:栈对象stack(),栈里存放元素。列表对象list(),也存放元素。
我在A类里面写成b.stack()和b.list(),对象能调用了,但是原来的元素值却没有过去。


"但是原来的元素值却没有过去" ,那么原来的元素值怎么存放的?b 又是如何调用的?都得看你代码才能清楚。能不能说具体点。给一段你的代码吧,可能说也不容易说清楚。

另,你的 SAX 看来是解决了吧。但我仍然把这个例子列在下面。
public void startElement(String uri, String localName, String rawName,
                            Attributes attributes)
   {
      if(localName.equals("someName"))
         // do job 1;
      else if(localName.equals("anotherName"))
         // do job 2;
      else if(localName.equals("otherNames"))
         // do job N;

   }

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
20#
发表于 2008-11-23 14:42 | 只看该作者
原帖由 fry_2006 于 2008-11-23 10:51 发表
根据查询表达式,查询得过程中才知道需不需要。得经过判断之后才知道满不满足查询

你总归事先是知道哪些节点不要的, 那写个xslt,把那些借点去掉不吗

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表