2013年12月14日 星期六

C# XElement.Load - Part 1 動態方法

讀取和分析XML,XElement允許移除許多舊的程式碼,同時移除被偵測出來的潛在錯誤類型和拼字的錯誤。在這裡將要介紹透過LINQ上XElement的運用範例。

從 XmlReader 載入 XElement,並選擇性地保留泛空白字元、設定基底 URI,以及保留行資訊。

public static XElement Load(
    XmlReader reader,
    LoadOptions options

)


用XElement建立XML樹狀結構,下面用二種簡單的方式。
XElement xmlTree1 = new XElement(
    "Root",
    new XElement("Child1", 1),
    new XElement("Child2", 2),
    new XElement("Child3", 3),
    new XElement("Child4", 4),
    new XElement("Child5", 5),
    new XElement("Child6", 6)

);

XElement xmlTree2 = new XElement(
    "Root",
    from el in xmlTree1.Elements()
    where ((int)el >= 3 && (int)el <= 5)
    select el

);

Console.WriteLine(xmlTree2);

第一個例子從一個網站加載一個網站地圖的XML文件。一個網站地圖包含所有頁面和(某些情況下)的圖像列表。該XElement的類型可以訪問遠程文件。在這個例子中,我們使用了本網站的站點地圖。

XName的:
創建了兩個XName的對象。
這些店無論是命名空間和本地Elements名稱。

要注意的是,對於一個自定義命名空間的XML文件,要使用的XNames物件取代字串來查找在XElement對象的Elements。最好用的XName參數中的Elements()方法。這將返回在站點地圖的所有URL的元素。然後在每個url元素,我們指向Elements的值。使用一個單獨的XName為LC Elements。

使用C# XElement.Load在地圖上

class Program
{
    static void Main()
    {
        //下載sitemapXML範本
        XElement sitemap = XElement.Load("http://www.dotnetperls.com/sitemap.xml");
        // 取得XNames.
        XName url = XName.Get("url", "http://www.sitemaps.org/schemas/sitemap/0.9");
        XName loc = XName.Get("loc", "http://www.sitemaps.org/schemas/sitemap/0.9");
        // 檢查 url Elements,然後存取每個Elements
        foreach (var urlElement in sitemap.Elements(url))
        {
            var locElement = urlElement.Element(loc);
            Console.WriteLine(locElement.Value);
        }

        // 排列
        Console.WriteLine("Count: {0}", sitemap.Elements(url).Count());
    }

}

以下是地圖的XML範例結構

<?xml version="1.0"?>
<urlset>
  <url>
    <loc>http://www.dotnetperls.com/xor</loc>
    <image:image>
      <image:loc>http://www.dotnetperls.com/xor.png</image:loc>
    </image:image>
  </url>
  <url>
    <loc>http://www.dotnetperls.com/yield</loc>
    <image:image>
      <image:loc>http://www.dotnetperls.com/yield.png</image:loc>
    </image:image>
  </url>
  <url>
    <loc>http://www.dotnetperls.com/zip</loc>
  </url>

</urlset>

可以看到地圖xml中包含1247網址的Elements。要忽略圖像標記的sitemap.xml的範圍內。這些不是由程式範例讀取。XElement.Load成功地從地圖xml讀取出來。
要注意的地方是,如果你運行這個程序,輸出取決於sitemap文件的當前狀態。如果XML文件被移動或存取不到時,程序會出錯。另外,程序調用Count()擴展方法來計算所有Elements()。這是需要在一個IEnumerable。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言