释放VB.NET下Linq to XML的智能提示的威力
作为忠实的C#粉丝,一向极少使用VB.NET去写代码。C#下几个符号就可以表达的含义,在VB.NET下往往需要好多单词才可以表达(换种角度,这在另外一些人眼中或许也是优点)。也许是C/C++/C#的代码看的太多了,再看VB.NET的代码,总觉得满屏幕堆满了字母,让我有点眼花,找不到代码的重点在哪儿,核心在哪儿。呵呵。
另外,对于Linq to XML,曾经尝试过,但是似乎没有想象中那么好用。所以在一次开发需要大量操作XML内容的功能时,还是选择经典的DOM方式。
但,现在,以上对VB.NET和Linq to XML的误解和偏见都有了很大改观,以致,最近又需要操作海量XML文档的时候,发现我只能用C#去实现而有些挠头。什么促使我有这么大的改变?广告之后,再见分晓。
---------------------------------为广告而生的分隔线---------------------------------
最近利用一切可以使用VS2010RC的机会使用它,发现真的比VS2008又有不少的进步,而且运行速度比beta2快多了。真希望我们可以快点把开发工具升级到VS2010,要是Framework版本也能升级到4.0就更好了。
终结者可以见证正式版的发布,而我,还是继续在魔兽世界里迷醉吧
---------------------------------随广告而亡的分隔线---------------------------------
广告之后,欢迎回来。相信大部分朋友们已经猜到答案了。因为我在标题中已经说明了这篇博文中的三个要素,其中“VB.NET”和“Linq to XML”已经在问题中提出来了,那答案自然就是“智能提示”了?没错。就是“智能提示”。
作为微软娇生惯养下的程序员,VS强大的智能提示既有功劳又有苦劳,甚至,在我面试个别初级程序员的时候,他们没有VS简直没法活,一行代码都写不出来(包括控制台的Hello World程序),其实我也差不多,离开VS基本上也只剩下半条命。话说回来,作为实际开发工作,如果有某种办法和工具可以提高开发效率和质量,为何要抱着记事本显示自己是高手呢?当然,无论如何,该掌握的东西还是必须要记住的。扯远了,不想引起争论。下面说说具体的做法吧,其中省去在黑暗中摸索的时间和过程。
首先看看在VB.NET中声明Linq to XML的XElement元素的语法,是难得的比C#看起来更简洁的语法:
Dim accountNumber As String = "510087321" Dim meterNumber As String = "100003680" Dim clientDetail As XElement = _ <ClientDetail> <AccountNumber><%= accountNumber %></AccountNumber> <MeterNumber><%= meterNumber %></MeterNumber> <ClientID>478</ClientID> </ClientDetail>
那么,如果我需要访问以上ClientDetail元素的ClientID子元素的内容“478”该怎么做呢?可以使用一下语法:
Dim clientID As String = clientDetail.<ClientID>.Value
当我书写以上代码获取ClientID的值的时候,VS并没有为我提供有用的智能提示,那么如何才可以得到有用的智能提示呢?其关键在于,我们需要向(笼统地说)VS/VB.NET提供我们将要读写的XML文档的架构定义信息,即后缀名为xsd的架构定义文件,将它包含进我们的项目,并在代码文件中导入它,然后在我们创建XElement的时候,定义好用到的架构。然后VS可以识别并开始为我们提供需要的智能提示。说到这里,已经完整的概述了所有需要的步骤。作为某些教编程的老师来说,大概可以下课了。但是,我会说的更详细一点,请继续看下去,下面会更图文并茂一些。
- 将架构文件包含进项目中
首先我们需要得到针对我们需要读写的XML文档的架构定义文件,其后缀名为“.xsd”,我们自己定义的好说,对于一些公共的,往往他们的namespace本身就是获取xsd文件的地方。比如http://schemas.xmlsoap.org/soap/envelope/,我就可以把它扔到浏览器的地址栏,然后猛击回车,就可以看到架构定义内容,然后另存成xsd文件就行了。当然这招并非屡试不爽(To:终结者,就是这招并不总是有效的意思)。
有了xsd文件,我们只需要把它添加到我们的项目中,比如我就建了一个“Schema”文件夹(文件名和文件夹名应该是可以随便根据需要起的),然后把用到的xsd文件放进去,并添加到项目中,就像下面的截图一样:
- 在代码文件中引入和使用架构
首先,我们需要在代码文件中导入需要用到的架构定义,导入的方法和导入命名空间类似,如截图中所示:
其中命名空间的URI就是xsd文件中的“targetNamespace”属性所指定的值:
- 创建和使用XElement时带上我们的架构
如下面的代码所示:
以上代码获取了从Web服务中得到的RateReply元素,在我们获取它时,同时指定了其需要遵循的架构定义(或者说namespace)是“http://fedex.com/ws/rate/v8”。
在我们经过以上的努力之后,在我们继续操作rootElement变量的时候,VS就可以为我们提供准确的智能提示了:
准确的智能提示,多一分则多,少一分则少。酷……
文末点睛之笔:
可惜C#似乎无法提供这样的能力。呵呵,所以说每一种语言都有其优缺点,都有擅长的出彩的一面和被人诟病的奚落的一面。(糟糕,点睛点到地上了……)