2011-04-03 73 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

相关问题