2011-04-03 68 views
0

我遇到了在C#4.0中使用LINQ to XML在Xml文件中查找元素的麻煩。查找具有多個名稱空間的元素

這裏是簡化的XML模式:

<?xml version="1.0" encoding="utf-8"?> 
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1"> 
    <content> 
     <gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/"> 
      <textContainer id="C_134572"> 
       <text id="T_399231">Content</text> 
       <text id="T_399232">Content</text> 
      </textContainer> 
      <textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0"> 
       <text id="T_399268">Content</text> 
      </textContainer> 
     </gdsPage> 
    </content> 
</mDoc> 

請注意這兩個在這個文檔定義單獨的命名空間。

我在我的代碼將它們定義爲如下:

XNamespace ns_mdoc = "http://schemas.microsoft.com/taxonomy/2003/1"; 
XNamespace ns_gds = "http://mysite.com/schemas/gdsPage/1/"; 

然後從我的理解,我應該能夠預先考慮命名一個元素上找到它,像這樣:

var query = 
       from links in 
        xdoc.Element(ns_gds + "linkContainer").Elements("link") 
       where links.Attribute("id").Value == "C_134608" || links.Attribute("id").Value == "L_233140" 
       select links; 

這將返回null。我試圖像軸搜索和後代存取的許多其他組合:

var stuff = from links in xdoc.Descendants(ns_gds + "linkContainer") 
         select new { 
          link = links.Element(ns_gds + "link").Value 
         }; 

我也用這兩個名字空間,一個那麼其他的嘗試。仍然是空的。

我在這裏錯過了什麼?

感謝您的關注。

回答

1

幾個問題在這裏:

  1. 您的XML不包含任何 linkContainerlink元素 - 它們被命名爲textContainertext

  2. 而且你必須使用Descendands() 而不是Elements(),如果你要訪問的子 節點不是 直接孩子。

  3. 你要設置的命名空間,在查詢所有 元素是 該命名空間下 - 你是 上 的Elements("link")部分目前缺少的命名空間。

有了這個XML:

<?xml version="1.0" encoding="utf-8"?> 
<mDoc xmlns="http://schemas.microsoft.com/taxonomy/2003/1"> 
    <content> 
    <gdsPage xmlns="http://mysite.com/schemas/gdsPage/1/"> 
     <textContainer id="C_134572"> 
     <text id="T_399231">Content</text> 
     <text id="T_399232">Content</text> 
     </textContainer> 
     <textContainer id="C_134607" brands="PRMR " did="1" renderOption="" needceiling="0"> 
     <text id="T_399268">Content</text> 
     </textContainer> 
    </gdsPage> 
    </content> 
</mDoc> 

這個工作對我來說:

var query = from links in xdoc.Descendants(ns_gds + "textContainer") 
           .Elements(ns_gds + "text") 
      where links.Attribute("id").Value == "T_399268" || 
        links.Attribute("id").Value == "L_233140" 
      select links; 
+0

真棒,這真是棒極了。謝謝! – nocarrier 2011-04-04 02:15:52

相關問題