About Linq To XML Default Namespace

先前知道,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宣告偷偷幹掉,當成什麼事都沒發生過。很鋸箭,小朋友不要學呀~~~

歡迎推文分享:
Published 26 May 2008 08:20 PM 由 Jeffrey
Filed under: ,
Views: 9,930



意見

# 小安 said on 17 May, 2009 09:10 AM

這功能看起來真方便!

可請教VB.NET 2005是否有此功能? 謝謝!

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<May 2008>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication