如何使用 Linq 检索后代

How to retrieve descendants using Linq

我有一个 xml 循环遍历每个 node 并且我想检索 xhtml 元素并且我尝试了

foreach (XElement element in xdoc.Descendants(namespace))
{
  var result = element.Descendants(namespace + "xhtml")
}

但枚举总是返回 empty

数据:

<namespace xmlns="http://www.find.org/schemas/">
  <date>2015</date>
  <xhtml:link xmlns:xhtml="xhtml:link" rel="alternate" />
  <xhtml:link xmlns:xhtml="xhtml:link" rel="alternate" />
  <xhtml:link xmlns:xhtml="xhtml:link" rel="alternate" />
</namespace>

您的 link 元素位于其自己的命名空间中,在命名空间 xhtml:link 中称为 xhtml。您需要将其用于 select 元素。

 // namespace of yout document
 var ns = (XNamespace) "http://www.find.org/schemas"; 
 // namespace of link elements
 var nsXhtml = (XNamespace) "xhtml:link";

 var result = xdoc.Root.Elements(nsXhtml+ "link");
 result.Dump();

在 xml 文档中,您应该注意 xmlns: 构造,这些构造可以位于顶部或在元素上定义。使用 no 或错误的命名空间将找不到您的元素。

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input =
                "<namespace xmlns=\"http://www.find.org/schemas/\">" +
                  "<date>2015</date>" +
                  "<xhtml:link xmlns:xhtml=\"xhtml:link\" rel=\"alternate\" />" +
                  "<xhtml:link xmlns:xhtml=\"xhtml:link\" rel=\"alternate\" />" +
                  "<xhtml:link xmlns:xhtml=\"xhtml:link\" rel=\"alternate\" />" +
                "</namespace>";

            XDocument xdoc = XDocument.Parse(input);

            List<XElement> links = xdoc.Descendants().Where(x => x.Name.LocalName == "link").ToList();
        }
    }
}​