当前位置:  开发笔记 > 编程语言 > 正文

在任何深度按名称查询XDocument元素

如何解决《在任何深度按名称查询XDocument元素》经验,为你挑选了6个好方法。

我有一个XDocument对象.我想使用LINQ在任何深度查询具有特定名称的元素.当我使用时Descendants("element_name"),我只获得了当前级别的直接子元素.我正在寻找的是相当于XPath中的"// element_name"...我应该使用XPath,还是有办法使用LINQ方法?谢谢.



1> Jon Skeet..:

后代应该绝对正常.这是一个例子:

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        string xml = @"

  
  
    
    
  
";
        XDocument doc = XDocument.Parse(xml);

        foreach (XElement element in doc.Descendants("grandchild"))
        {
            Console.WriteLine(element);
        }
    }
}

结果:



@pfeds:然后我会使用`doc.Descendants("Cars").后代("Part")`(或者可能是`.Elements("Part")`如果他们只是直接的孩子.
六年过去了,仍然是一个很好的例子.事实上,这仍然比MSDN解释更有帮助:-)
@DrorHarari不,没有抛出异常:尝试`var foo = new XDocument().后代("Bar").后代("Baz");`因为`Descendants`返回一个空的`IEnumerable `而不是`null`.

2> Jelgab..:

表示命名空间的示例:

String TheDocumentContent =
@"

   
      
         
         
         
         
         
      
   

";

XDocument TheDocument = XDocument.Parse( TheDocumentContent );

//Example 1:
var TheElements1 =
from
    AnyElement
in
    TheDocument.Descendants( "{http://www.w3.org/2001/XMLSchema}Child" )
select
    AnyElement;

ResultsTxt.AppendText( TheElements1.Count().ToString() );

//Example 2:
var TheElements2 =
from
    AnyElement
in
    TheDocument.Descendants( "{http://www.w3.org/2001/XMLSchema}Child" )
where
    AnyElement.Attribute( "theName" ).Value.StartsWith( "G" )
select
    AnyElement;

foreach ( XElement CurrentElement in TheElements2 )
{
    ResultsTxt.AppendText( "\r\n" + CurrentElement.Attribute( "theName" ).Value );
}


但是,如果我的源xml没有名称空间怎么办?我想我可以在代码中添加一个(必须对此进行研究),但是为什么这样做是必要的呢?无论如何,root.Descendants(“ myTagName”)找不到在我的代码中深埋三到四层的元素。
谢谢!我们正在使用datacontract序列化.这会创建一个标题,如我很难过,为什么我没有得到任何后代.我需要添加{http://schemas.datacontract.org/2004/07/DataLayer.MyClass}前缀.

3> Francisco Go..:

你可以这样做:

xml.Descendants().Where(p => p.Name.LocalName == "Name of the node to find")

这里xml是一个XDocument.

请注意,该属性Name返回一个具有a LocalName和a 的对象Namespace.这就是为什么你要使用,Name.LocalName如果你想按名称进行比较.



4> Nenad Dobril..:

后代将完全按照您的需要进行操作,但请确保您已将名称空间名称与元素名称一起包含在内.如果省略它,您可能会得到一个空列表.



5> 小智..:

有两种方法可以实现这一目标,

    LINQ到XML

    XPath的

以下是使用这些方法的示例,

List result = doc.Root.Element("emails").Elements("emailAddress").ToList();

如果使用XPath,则需要对IEnumerable进行一些操作:

IEnumerable mails = ((IEnumerable)doc.XPathEvaluate("/emails/emailAddress")).Cast();

注意

var res = doc.XPathEvaluate("/emails/emailAddress");

结果是空指针,或没有结果.



6> Tahir Hassan..:

我使用的XPathSelectElements扩展方法与方法的工作方式相同XmlDocument.SelectNodes:

using System;
using System.Xml.Linq;
using System.Xml.XPath; // for XPathSelectElements

namespace testconsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument xdoc = XDocument.Parse(
                @"
                    
                        john
                    
                    
                        fred
                    
                    
                        mark
                    
                 ");

            foreach (var childElem in xdoc.XPathSelectElements("//child"))
            {
                string childName = childElem.Element("name").Value;
                Console.WriteLine(childName);
            }
        }
    }
}

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有