先前知道,VB.NET在XML表示法上比C#便利一些,可以直接在程式碼裡寫起XML來(見Deep XML Support一節),不用搞出一堆New XElement, New XAttribute, 簡潔許多。

剛才又發現,在Namespace處理上,VB.NET 2008再次略勝一籌!

假設有以下的XML,其中宣告了Namespace:

<?xml version="1.0" encoding="utf-8" ?>
<Fruits Country="Taiwan" xmlns="http://xml.darkthread.net">
  <Fruit Id="1">Mango</Fruit>
  <Fruit Id="2">Banana</Fruit>
  <Fruit Id="3">Bell Apple</Fruit>
</Fruits>

用以下的程式測試,會發現未宣告Namespace的Test1會查不到任何符合的Fruit元素,得寫成Test2的做法才成。

class LinqTest
{
    public static void Test1()
    {
        XDocument xd = XDocument.Load("MiniData.xml");
        //it will get "0"
        Console.WriteLine(xd.Root.Elements("Fruit").Count());
    }
 
    public static void Test2()
    {
        XDocument xd = XDocument.Load("MiniData.xml");
        XNamespace xn = "http://xml.darkthread.net";
        //it will get correct answer "3"
        Console.WriteLine(xd.Root.Elements(xn + "Fruit").Count());
    }
}

重點來了! Test2裡只展示了一個xn + "Fruit"。事實是,程式裡所有用到Element Name, Attribute Name的地方全都要比照改寫,如果程式有兩三百處動用了Element、Attribute名稱,意味著要多寫兩三百個"xn +",實在很笨,難道不能設定Default Namespace嗎?

VB.NET的開發者有福了,有個Imports xmlns="http://xml.darkthread.net"的寫法,可以指定預設命名空間,省去即使是Default Namespace也得每次額外聲明的困擾。但很遺憾地,這個寫法在C#上並沒有對應(這裡有篇MS Online Support參與的討論,證實了這點)... orz

C#! 加油呀~~

PS: 我偷偷地用了鋸箭法避開要加數百個XNamespace Prefix的問題-->在讀入前把XML原文中的xmlns宣告偷偷幹掉,當成什麼事都沒發生過。很鋸箭,小朋友不要學呀~~~


Comments

# by 小安

這功能看起來真方便! 可請教VB.NET 2005是否有此功能? 謝謝!

Post a comment