关于LINQ to XML的一个简单问题

时间:2010-06-21 11:35:07

标签: c# .net linq-to-xml namespaces

<root xmlns:h="http://www.w3.org/TR/html4/"
      xmlns:f="http://www.w3schools.com/furniture">

<h:table>
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table>
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>

我正在尝试练习LinqToXml但我无法弄清楚我想要什么。我怎么能查询具有h或f命名空间的表元素? 这就是我尝试过的。我尝试过不同的但是没有用。

var query = from item in XDocument.Parse(xml).Elements(ns + "table")
            select item;

2 个答案:

答案 0 :(得分:5)

这不起作用,因为您错过了查询中的root元素。这可行:

XNamespace ns = "http://www.w3schools.com/furniture";
var query = XDocument.Parse(xml).Element("root").Elements(ns + "table");

现在,如果问题是您要查找所有“table”元素而不管命名空间的,那么您需要这样的内容:

var query = XDocument.Parse(xml)
                     .Element("root")
                     .Elements()
                     .Where(element => element.Name.LocalName == "table");

(编辑:如上所述,如果您愿意,可以使用XDocument.Root来获取根元素。重点是尝试直接从文档节点本身访问table元素不会起作用。)

答案 1 :(得分:2)

命名空间前缀不能保证是特定的字母或字符串。最好的方法是通过限定名称空间进行搜索。

这将获得名称空间为XElement xml的所有直接子节点uri:namespace ...

var selectedByNamespace = from element in xml.Elements()
                          where element.Name.NamespaceName == "uri:namespace"
                          select element;

另一种选择是根据完全限定名称选择元素。

var ns = "{uri:namespace}";
var selectedElements = xml.Elements(ns + "table");