從.NET誕生之日起就有了XML類庫,但是從使用上來說非常不方便。例如我們需要構造一個XML文檔時,使用DOM API就要這樣搞:
var xmlDoc = new XmlDocument(); var rootEle = xmlDoc.CreateElement("persons"); xmlDoc.AppendChild(rootEle); var person1 = xmlDoc.CreateElement("person"); person1.InnerText = "Tom"; var person1Age = xmlDoc.CreateAttribute("age"); person1Age.Value = "10"; person1.Attributes.Append(person1Age); rootEle.AppendChild(person1); var person2 = xmlDoc.CreateElement("person"); person2.InnerText = "Jerry"; var person2Age = xmlDoc.CreateAttribute("age"); person2Age.Value = "8"; person2.Attributes.Append(person2Age); rootEle.AppendChild(person2);
別看這麼多行代碼,但實際上它只構造了這麼簡單的一個XML:
<persons> <person age="10">Tom</person> <person age="8">Jerry</person> </persons>
我承認,DOM API的確非常嚴謹(如XmlDocument和XmlElement的歸屬關系),非常符合定義,也非常的面向對象,但是這易用性也實在太差了。記得在03還是04年的時候,我為在為項目做一個編輯XML文檔的WinForm應用程序,當時也不像現在那麼容易想到“偷懶”的法門,而VS 2003也不像VS 2005/2008那麼好用,因此可謂做的勞心費神。這個情況在.NET 2.0中也沒有得到改變,直到有一天,LINQ to XML隨.NET 3.5橫空出世,於是乎XML的生活一下子變得美好了很多。例如上面的功能只需寥寥數行便可以實現:
var xmlDoc = new XElement("persons", new XElement("person", "Tom", new XAttribute("age", 10)), new XElement("person", "Jerry", new XAttribute("age", 8)));
雖然LINQ to XML一直是所謂C# 3.0中LINQ特性的一部分,與LINQ to SQL,LINQ to Object及LINQ to……某個別的並列,但我始終認為LINQ to XML實則還是LINQ to Object的一種特殊形式,只是它用於操作XML而已。它的一切都是System.Xml.Linq命名空間下相關類庫(如XElement)在起作用,不關LINQ什麼事情。XElement等相關類型大大簡化了我們的開發,與DOM API相比,無論是XML的構造還是讀取都容易了許多。不過俗話說得好:“不怕不識貨,就怕貨比貨”,這樣的API與Ruby Markup Builder相比還是有明顯差距。請看:
builder = Builder::XmlMarkup.new xml = builder.persons { |b| b.person("Tom", :age => "10") b.person("Jerry", :age => "8") }
請看上面這段代碼,它自然沒有使用Ruby語言的標准著色方式。我著色的目的是體