RSS 2.0 Feed
2004-04 Entries
摘要:记得以前思归曾指导我们凡事都该多求一种alternative,看了ghj1976关于在.NET中利用XmlNamespaceManager来处理XPath名称空间引用的方法,又看了Zee关于直接在XPath过滤表达式中利用XPath内置节点函数来处理类似问题的另一种方法,那么我也来贡献一种非常有用的解决办法——利用MSXML中DOM的SelectionNamespaces二级属性(second-level properties)。 如果你还在基于ActiveScript脚本引擎或者COM的环境中操作XML的话,一般你都是使用Microsoft XML Parser(目前主要是用3.0或4.0)这套API,而且大部分时候你会与DOM打交道。在DOM对象上有很多的native properties,如validateOnLoad、async等等,这些属性通常会影响DOM运行时的表现。为了能够更方便的扩展一些新运行时的新属性,MSXML的DOM上提供了setProperty/getProperty的方法,用它们可以为DOM运行时提供基于key/value的额外属性,也即二级属性。 在MSXML 3.0中,为更方便的应用XPath等相关技术,DOM开始支持SelectionLanguage和SelectionNamespaces这两个二级属性。这个SelectNamespaces就是用来指定额外的名称空间映射的,如下: dom.setProperty("SelectionNamespaces", "xmlns:x='urn:mine' xmlns:y='urn:yours'")dom.selectSingleNode("/x:foo/y:bar") 则如果dom节点的XML内容是这样的: <foo xmlns="urn:mine">  <yours:bar xmlns:yours="urn:yours" /></foo> 便可以正确的选取到中间一行的urn:yours名称空间中的bar元素(注意本例中XML默认名称空间及名称空间等价的概念)。 这个技术在功能上等价于使用.NET中的XmlNamespaceManager,只是在非.NET环境中(包括在开发InfoPath表单中使用的Microsoft Script脚本环境或者IE的脚本环境中)这还是非常正式的解决方法(效率也会比使用XPath过滤表达式要高效一些)。 希望在你使用MSXML的DOM对象遇到类似问题时有所帮助吧。...[阅读全文]

posted @ | Feedback (5) |

摘要:周末熬夜终于搞定的AOP尝鲜系列文章第三篇一出,就收到了很多朋友的反馈和邮件。首先感谢大家的关注!也衷心谢谢给我指出文章错误、文字疏忽的朋友们! 有一位细心朋友今早给我发来邮件,“批评”我又在简单问题上面犯了糊涂,他所指的是文章中出现的这个语句: Console.WriteLine("Add: " + Thread.CurrentContext); 其中Thread.CurrentContext属性将返回当前线程所处的执行环境,类型是System.Runtime.Remoting.Contexts名称空间中的Context。一个字串常量怎么可以和一个对象直接相加呢!肯定是我忘了写ToString()了吧?他对此的评语也很有意思,“老兄以为在写JScript呐!”……嘿嘿!一针见血啊! 我回复他,感谢他的热心和仔细(再次:),顺便问了一句:我文中的代码你动手编译过吗?因为我清楚的记得像这样的代码我已经不是写一次两次了——偶的实践经验告诉我:这个语句是可以在Visual C# .NET中编译并正确运行的!不仅如此,我还经常写这样的语句: string tempFilename = null;tempFilename += Environment.TickCount + ".tmp"; // 啊?string += int? 或者: string guidKey = "{" + Guid.NewGuid() + "}"; // 奋特! 再或者: string logLine = "Log: " + DateTime.Now; // 咣当…… ……就像读者所说:这是C#还是JScript啊!?实际上,我也没有在C#语言规范中找到能解释这个现象的理论依据(如果你知道的话希望能告诉我:)。所以我只能说这是Visual C# .NET编译器的一种编译器优化手段造成的side effect(将静态字串相加转化为String.Concat()调用)——不过事实证明,这种写法的效率比起String.Format()还要高(虽然没有人家灵活),甚至有时候比每一个用ToString()还要快!原因是什么?也很容易分析出来,留给聪明的你做个练习吧(可以把你的想法用反馈告诉我)!:) 最后还是按照惯例,做个练习——想想下面这个表达式中对quiz求值将是什么结果? string quiz = null;quiz += 1 + 2 + "3" + 4 + 5; P.S: USE THIS TRICK AT YOUR OWN RISK! AND IT IS NOT RECOMMENDED AT ALL (THOUGH IT'S OFTEN USEFUL AND HANDY DURING DEBUGGING.)...[阅读全文]

posted @ | Feedback (18) | Filed Under [ .NET Stuffs ]

摘要: Part III: Context-based Interception Towards a Mini AOP Framework   摘要:在本文的上一篇中,我们利用.NET Remoting基础架构中的真实代理/透明代理技术实现了不针对具体类型、具体方法的通用方法调用拦截机制。在本篇文字中,我们介绍可以用于在.NET中实现基本AOP(面向方面编程)的更深入的基于ContextBoundObject机制的相关技术,并结合该技术的优势和劣势提出了一个已经在我们设计的项目中局部应用的一个AOP框架原型思路。   BTW: 由于工作调动等各方面的原因,偶的文章也像本年度偶最期待的产品Microsoft Visual Studio 2005一样频繁跳票……不过就在今晚,我终于完成了本系列文章最后一部分的写作。实际上,最近手头的工作已经离所写的内容越来越远,不过回头再鼓弄起这些技术,我脑中仍可激发出阵阵的奇思妙想……我想,这就是技术的魅力吧!希望您读过我的文章之后也能够同我一样被这些美妙的事物激发灵感,感悟个中快乐——只是,不要像我这样熬夜。:)...[阅读全文]

posted @ | Feedback (0) | Filed Under [ General ]