查找具有多个名称空间的元素

时间:2011-04-03 23:42:26

标签: xml linq linq-to-xml

我在使用C#4.0中的LINQ to XML在Xml文件中查找元素时遇到了麻烦。

这是简化的Xml Schema:

<?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。我尝试了许多其他访问器组合,如Axis搜索和Descendants:

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

我也试过使用两个名称空格,一个是另一个。还是空的。

我在这里缺少什么?

谢谢你看看。

1 个答案:

答案 0 :(得分:1)

这里有几个问题:

  1. 您的XML不包含任何内容 linkContainerlink元素 - 它们被命名为textContainertext

  2. 此外,您必须使用Descendands() 如果孩子,而不是Elements() 您要访问的节点不是 直接孩子。

  3. 您必须在所有名称上设置名称空间 查询中的元素 在那个命名空间下 - 你是 缺少当前的命名空间 Elements("link")部分。

  4. 使用此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;