XML报表数据的新大陆.doc

上传人:哈尼dd 文档编号:3258696 上传时间:2019-08-06 格式:DOC 页数:223 大小:1.02MB
返回 下载 相关 举报
XML报表数据的新大陆.doc_第1页
第1页 / 共223页
XML报表数据的新大陆.doc_第2页
第2页 / 共223页
XML报表数据的新大陆.doc_第3页
第3页 / 共223页
XML报表数据的新大陆.doc_第4页
第4页 / 共223页
XML报表数据的新大陆.doc_第5页
第5页 / 共223页
点击查看更多>>
资源描述

《XML报表数据的新大陆.doc》由会员分享,可在线阅读,更多相关《XML报表数据的新大陆.doc(223页珍藏版)》请在三一文库上搜索。

1、XML - 报表数据的新大陆 随着B/S系统的普及和XML技术的深入应用,越来越多的数据包裹着XML的外衣被存储和扔来扔去。这些数据很多源自数据库,但经过一定的处理,数据更精简,更贴近应用。如果报表工具能利用这些XML数据,则可以减少数据库查询和报表数据运算操作,因为这些XML数据的始作俑者已经完成了这些操作。因此说XML是报表数据的新大陆。 传统的报表工具都是只能处理关系型数据库,基本上不能处理其他数据。随着时代的发展,一些报表工具加上了处理XML文档的能力,但需要编程,编写并配置插件,如此报表程序结构复杂,接口众多,用户还需要根据各种规范动手编写程序,若XML文档格式有很多种,就需要编写很

2、多种的插件,报表开发量不小。 如果实现了一种能处理XML文档,从中获得报表数据的通用方法。则在定制报表模板的时候就教育报表引擎如何从XML文档获得数据,则对于所有的或大部分的XML文档无需编程,可减少报表开发量。 那么如何通用的处理具有复杂树状结构的XML文档呢? 大家知道,处理XML文档有两种模式,一个是DOM方式,另一个是流模式。DOM方式处理方便,但速度慢耗内存,流模式处理速度快,省内存但使用不方便。对于.NET平台,使用System.Xml.XmlDocument对象来使用DOM方式处理XML文档,而使用XmlReader 来使用流模式处理XML文档。 W3C国际标准组织设计XML文档

3、的目标是方便的存储和交换小型数据包,而不考虑数据的冗余。因此若实际系统中出现巨大的XML文档,则大多数情况下可以认为是不恰当的使用XML技术。因此我认为报表工具不应当处理巨大的XML文档,在此前提下,为了实现方便,采用DOM方式来处理XML文档。 在.NET中使用XmlDocument加载一个XML文档后,会形成一个以XmlDocument为根节点的XML对象树状结构,面对这个XML树结构,获取其中的数据方法很自然的就是使用XPath技术了。XPath技术就是在XML树状结构中,以某个节点作为起始节点,使用特定的描述表示的路径移动到其他的节点,一般的是向其下层节点移动,比如移动到某个子节点或孙

4、节点,移动到某个属性等等。 传统的报表数据源模型是两层的,即使扩展到可以处理XML文档也只能处理一次,既从根节点出发,使用某个XPath 获得字段的值。如此只能处理一次,处理完毕后XML就被扔掉了。但很多时候需要对XML文档进行进一步处理。此时传统的两层报表数据源模型是不够的。 为了能对XML文档进行精耕细作,需要从传统的两层数据源结构突破到多层的报表数据源模型。在多层数据源节点中,每一个节点都映射到XML文档中的某个节点,而它的子节点则使用XPath路径映射到XML中的其他节点。如此递归循环后则多层的数据源可以映射到XML文档中的任意节点。多层数据源模型实际上就是一个数据源树,因此处理XML

5、文档也就是将两颗树在某些节点上钉在一起,而XPath就是钉子。因此需要注意各级数据源节点的XPath配置的连续性,若一个数据源节点的XPath设置不对,就像它钉错了XML节点或者干脆钉在空处。则它本身和所有的子孙节点都都会绑定落空的。 在实际应用中,由于XML文档不是专门为报表而产生的,因此报表工具还可能要离开XML文档来获取更多的报表数据,此时可能需要从XML文档跳到其他XML文档,或者返回数据库继续执行SQL查询。这就非常考验报表数据源模型的灵活性了。 大家都知道RSS文档是一种XML文档,在这里使用博客园的RSS文档为例子说明从XML读取报表数据的过程。首先考察一下RSS文档的结构,博客

6、园首页的RSS文档URL为 http:/ ,根节点为 rss , 然后有个 channel 子节点,下面包含了RSS文档的基本信息,然后有若干个item节点,列出了所有文章的基本信息。item节点下面是文章的基本信息,其中 wfw:commentRss 子节点的内容是针对该文章回帖信息RSS文档的URL。可以根据这个URL加载的回帖信息RSS文档,根据RSS文档结构可以定义出如下的报表数据源和RSS文档的映射关系。(源码网整理:) 这里的RSSXML文档有三层结构,而且需要动态加载XML文档进行更深入的处理,因此传统的两层结构是肯定不够的,必须采用多层次的报表数据源结构。其过程是相当复杂的,步

7、骤为1. 加载 http:/ 处的XML文档,作为主XML文档,生成一个System.Xml.XmlDocument 对象,并以该XML文档对象作为处理的出发点。 2. 使用XPathrss遍历所有符合该路径的XML节点,很显然只处理了一个节点,此时当前位置就移动到rss节点。 3. 从当前节点处使用XPathchannel/title获得网站标题,使用channel/link获得网站地址,channel/description获得网站说明,channel/pubDate获得文档发布时间。 4. 从当前节点处使用channel遍历所有符合该路径的XML节点,很显然只处理了一个节点,此时当前位置

8、就移动到了channel节点。 5. 变量当前节点下的所有的item子节点,并依次设置为当前节点。 6. 从当前节点处使用“title获得文章标题,使用link获得文章地址,使用”author获得作者,“pubDate获得发布时间,description获得文章内容,slash:comment获得回复数,“wfw:commentRss获得回复RSSXML文档的URL。 7. 当处理wfw:commentRss节点时,程序根据某个特定的设置加载该节点数据指向的XML文档,也就是加载针对当前文章的回复RSSXML文档。并遍历刚刚加载的XML文档的所有符合rss/channel/item的节点,并依

9、次设置为当前节点。 8. 从当前节点处,使用author获得回复作者,使用”pubDate获得回复时间,使用description获得回复内容。 9. 由于RSSXML文档中的description节点处保存的时HTML代码,因此还需要解析HTML代码并提取其中的纯文本内容。 从上面的步骤可以看出,数据源结构中的每一个节点都钉到了XML文档中的某个节点,而且在回复列表这个节点中,程序执行了XML文档的跳转,从主XML文档跳到回复RSSXML文档,而且是处理树状结构的,因此是递归操作,很多状态信息都由系统调用堆栈自动保存,无需程序自己保存了。 如果报表程序能直接连接到博客园数据库的话,还可以从文

10、章作者这个节点执行XML文档到数据库的跳转,直接查询数据库,获得文章作者的一些注册信息。实事上,这个数据源树状结构中每一个节点都可以发生XML到XML,XML到数据库,数据库到XML的三种跳转,这大大扩展了获取报表数据的灵活性。 如果一个信息系统是纯XML应用的话,则报表工具就可以在众多的XML文档中跳跃着采集数据而不需要查询数据库,就像少林寺的武僧在梅花桩上打架而不用碰地,因此也就不用管下面是JAVA土壤的还是.NET土壤。此时所有的数据库操作,业务逻辑等等都运行在后台,而报表工具无需关心,只要系统底层安全可靠,则报表模块也就安全可靠,系统底层无论如何修改,只要XML文档格式不变则报表模块就

11、不需要修改。对于非常复杂的报表数据源,超出了报表工具的定制能力,则可以编程提供一个XML文档供报表程序使用。以前系统是直接通过API向报表程序提供复杂报表数据,而现在通过XML文档以“隔山打牛”的方式向报表程序提供复杂报表数据。此时系统结构更安全,边界更清楚,体现了XML WebService的指导思想。这种获取数据的思想可以不局限于报表数据的获取,还可以应用到其他领域。 以上讨论的应用系统限于B/S系统,但可以设想,C/S系统经过改造,可以通过某种方式向报表工具提供XML数据文档。 从上面的讨论可以看出,XML确实是报表数据的新大陆,本人写的报表工具已经初步体现了这种思想。但这种思想可能有点

12、激进,还不成熟不完善,希望大家多多指点。XML源文件: - - 博客园-首页原创精华区 http:/ 技术改变世界 zh-cn Mon, 07 Jun 2010 12:57:20 GMT Mon, 07 Jun 2010 12:57:20 GMT 60 - 网站管理艺术 http:/ 诺贝尔 诺贝尔 Mon, 07 Jun 2010 12:56:00 GMT http:/ - - !CDATA 阅读: 0 评论: 0 作者: 诺贝尔 发表于 2010-06-07 20:56 原文链接做人的艺术是:人不犯我,我不犯人,人若犯我,我必犯人! 做网站也要有艺术,虽然我没怎么做过网站的管理员,不过我也

13、曾经做过某个不足100人的论坛的管理员,偶尔还能得到一点管理上面的心得。 下面说说,大家讨论一下: 一、犯贱者的应对方式: 比如谩骂之类的,一开始很害怕删掉会影响人气,也害怕这样会显得自己不够大度,但是后来的经验总结,对于这种是要坚决地抵制的。你不可能要求所有人都爱你,容忍是有限度,也必须要有限度。虽然放弃了这些客户,但是也应该看到这样是有助改善现有用户的用户体验和用户环境的,从这点上看,其实利大于弊。在商业管理学上,这种就叫放弃劣质客户,挽留优质客户。 二、灌水者往往都是很热情地 论坛不是靠什么专家而火的,靠的就是热情地灌水者。对于我来说,我宁愿要几个灌水爱好者,也不会稀罕什么专家。 三、访

14、客大部分都是潜水者 在网站上评论的,是网络上总体素质比较低的一群人,这个不是我说的,是马云说的,但是也很有道理,据我的经验来看,访客大部分是潜水者,这部分精英隐藏在幕后,往往会被管理人忽略,而在制定规章制度上会伤害这部分潜水者。 四、严防人身攻击 灌水者的素质不会很高,所以往往会出现技术上的笑话,这个时候会有一大群的伪道德家出来骂人。我觉得应该小心这种行为。一方面我觉得灌水者真的很伟大,另一方面,人身攻击是任何人都受不了的,不管它是高手才是菜鸟,也是有尊严的。 五、大部分访客都不会进论坛 以前和一个搞文学的网站的管理员很熟,他告诉我,大部分访客都不会去论坛。我想有几个原因,一个是论坛操作比较复

15、杂;第二个是,这个管理员会把论坛上优秀的文章集结起来,做成静态页面放在网站栏目里面,这样对潜水者来说,可能更加方便。前面也说了,潜水者才是我们的主客户。因此,我觉得身为管理员,应该尽力把优秀的东西挖掘出来,做成独立的索引,方便访客。 六、我们不是唯一的交流渠道 不管多么优秀的网站,我想还是应该清醒认识到,客户对我们的爱不是唯一的,有时候你越是想绑住客户,越是伤害了客户。评论: 0查看评论发表评论软件研发团队管理年会(上海,7.10-7.11)最新新闻: 为什么Facebook解决不了隐私问题:基因使然(2010-06-07 20:48) 微软CEO鲍尔默十大愚蠢语录 要活埋谷歌居首(2010-

16、06-07 20:21) 谷歌2010开发者大会Chrome相关内容总结(2010-06-07 20:19) 未来的办公室:可移动可漂浮可健身(2010-06-07 18:26) 快网CEO刘再德:做贩卖网速的生意(2010-06-07 18:16)编辑推荐:平凡不愿平庸,两年的编程心路网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库 - How does ElementName Binding work Part 2 B

17、indingExpression http:/ idior idior Mon, 07 Jun 2010 12:28:00 GMT http:/ - - !CDATA 阅读: 27 评论: 0 作者: idior 发表于 2010-06-07 20:28 原文链接In part 1, I gave a general finding rule for ElementName binding, it works in most cases, however there are some cases you cannot explain them with the general rule. I

18、will cover some of them in the following articles which involve some advanced concept in WPF, like BindingExpression and InheritanceContext. What happens when ElementName binding is used in DataTrigger? Take a look at following codes:   <Window x:Class=TestElementBindingInUserControl.MainWin

19、dow> <local:CustomControl1/> </Window> <Style TargetType=x:Type local:CustomControl1> <Setter Property=Template> <Setter.Value> <ControlTemplate TargetType=x:Type local:CustomControl1> <StackPanel> <Button Name=btn Content=PFS Button/> <TextBlock

20、 Name=tbk /> </StackPanel> <ControlTemplate.Triggers> <DataTrigger Binding=Binding ElementName=btn, Path=Content Value=PFS Button> <Setter TargetName=tbk Property=Text Value=PFS TextBlock/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> <

21、;/Setter.Value> </Setter> </Style> Let’s go back to our rules first:Start from the element which applied the ElementName Binding, keep searching on the logic tree via its logic parent, until an element which has NameScope is found, let’s call it NameScopeElement. If n

22、o element owns a NameScope, search will stop. Call the NameScope.FindName method on the found NameScope. If the element is found, return it, otherwise try to get the template parent of NameScopeElement; if the template parent is null, it will stop search. or it goes back to step 1, search on the log

23、ic tree for element owns a NameScope.If we start from DataTrigger, you will find its logic parent would be null, the search will not continue.  Ok, I have to acknowledge the original statement is oversimplified. It actually starts form the TargetElement of the BindingExpression which is created

24、 by the ElementName Binding. Here it is the CustomControl1.  A little confused here? Let’s see what’s the BindingExpression and what’s the relationship between a BindingExpression and Binding.Binding class is the high-level class for the declaration of a binding; the Binding c

25、lass provides many properties that allow you to specify the characteristics of a binding. A related class,BindingExpression, is the underlying object that maintains the connection between the source and the target. Normally BindingExpression is created by WPF framework, WPF programmer rarely use it in functional codes. A key difference between

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1