XML 作为一种通用的,跨平台的数据交换格式,在程序界是公认的事实;而 .Net Framework 以前的版本中麻烦的 XML 操作,常常令程序员心生不快。记得以前试图生成一个 XML 文件,无非是两种模式:用 StringBuilder 拼接 XML 字符串,或者是用 XMLDocument / XMLWriter 进行 DOM 操作。StringBuilder 是有足够的速度,但是没有稳定性的保障,需要多次过滤以保护 XML 文件的完整性。而使用 MSXML 的包装 System.XML 进行操作,又未免太麻烦了些。
XML 字面量功能是 Visual Basic 9 为解放程序员劳力作出的一项非常大的改进,它可让程序员直接在代码中嵌入 XML 进行生成操作。借助编译器的力量,XML 字面量调用 System.XML.Linq 进行 XML 的动态生成。在 C# 中,虽然同样可以调用这个命名空间下的类进行生成,但是远没有 Visual Basic 的模式轻松,省力。举一个简单的范例,用于动态生成一个 XML 文档:
旧的 String Builder 模式:
Imports System.Text
Public Function BuildXMLFromStringBuilder()Function BuildXMLFromStringBuilder(Name As String, Age As Integer) As String
Dim XMLBuilder As New StringBuilder
With XMLBuilder
.AppendLine("<Person>")
.Append("<Name>")
.Append(Name)
.AppendLine("</Name>")
.Append("<Age>")
.Append(Age)
.AppendLine("</Age>")
.AppendLine("</Person>")
End With
Return XMLBuilder.ToString()
End Function
旧的 XML DOM 模式:
Public Function BuildXMLFromXMLDom()Function BuildXMLFromXMLDom(ByVal Name As String, ByVal Age As Integer) As String
Dim XMLDocument As New XMLDocument
Dim RootElement As XMLElement = XMLDocument.CreateElement("Person")
Dim NameElement As XMLElement = XMLDocument.CreateElement("Name")
Dim AgeElement As XMLElement = XMLDocument.CreateElement("Age")
With RootElement
.AppendChild(NameElement)
.AppendChild(AgeElement)
End With
With NameElement
.Value = Name
End With
With AgeElement
.Value = CStr(Age)
End With
XMLDocument.AppendChild(RootElement)
Return XMLDocument.ToString()
End Function
新的 XML 字面量:
Public Function BuildXMLFromXLinq()Function BuildXMLFromXLinq(ByVal Name As String, ByVal Age As Integer) As String
Return <Person>
<Name><%= Name %></Name>
<Age><%= Age %></Age>
</Person>.ToString()
End Function
前两个示例可以在 Visual Basic 8 中编译通过;第三个示例则需要 Visual Basic 9 的支持。很显然,XLinq 确实可以解放程序员的工作劳力,并且效率不逊于第二种方式。这一点将在我的另一个系列中得到印证。如果各位曾经使用过 ASP,或者在 ASP.net 中使用过类似 ASP 的语法,将会感到非常亲切 - <%=%> 的语法模式又回来了!不过这一次可不再是生成网页了。另外,在书写 XML 的过程中,您不需要使用换行符,直到最后一个 XML 标签被关闭。
您甚至可以在 XML 字面量中使用集成的 LINQ 查询,藉以循环生成 XML Element 列表:
Public Function BuildXMLFromXLinqExtended()Function BuildXMLFromXLinqExtended() As String
Dim Cities As String() = {"London", "Beijing", "Paris", "Fuzhou"}
Return <Cities>
<%= From City In Cities _
Select <City><%= City %></City> %>
</Cities>.ToString
End Function
事实上,XLinq 能做到的不仅仅是创建一个 XML 文档,它还完成了 XML == Objects 的工作,亦即 Linq To XML.诸如 Persons.<Person>.<Name>.First 这样的语法完全可以替代 XPath;虽然顽固的我现在还是坚持着 XPath.