简体   繁体   English

获取linQ到xml子节点的883812976388标签列表

[英]Retrieve list of xml tag of child nodes in linQ to xml

I'm trying to get all the list of the different child nodes (not starting from root) of a loaded XML into a list of strings, I had done using System.Xml library but I want to write the same code with LINQ to XML too.我试图将加载的 XML 的不同子节点(不是从根开始)的所有列表放入字符串列表中,我已经使用 System.Xml 库完成但我想用 LINQ 编写相同的代码到 XML也。 I had found a code that helped me a lot but it starts from Root, here is the code:我找到了一个对我有很大帮助的代码,但它是从 Root 开始的,代码如下:

List<string> nodesNames = new List<string>();
XDocument xdoc1 = XDocument.Load(destinationPath);
XElement root = xdoc1.Document.Root;

foreach (var name in root.DescendantNodes().OfType<XElement>()
        .Select(x => x.Name).Distinct())
{
        if (!nodesNames.Contains(name.ToString()))
        nodesNames.Add(name.ToString());
}

With this, I get the list of all child nodes + the parent node too, which I don't want to use.FirstChild or to delete manually from the list because I want a TOTALLY dynamic code and I have in input the parent node passed by the user.有了这个,我也得到了所有子节点+父节点的列表,我不想使用它。FirstChild 或从列表中手动删除,因为我想要一个完全动态的代码并且我在输入中传递了父节点由用户。

For a better comprehension, this is the code that working for me but with System.Xml:为了更好地理解,这是对我有用但使用 System.Xml 的代码:

List<string> nodesNames = new List<string>();
XmlDocument doc = new XmlDocument();
doc.Load(destinationPath);
XmlNodeList elemList = doc.GetElementsByTagName(inputParentNode);

for (int i = 0; i < elemList.Count; i++)
{
        XmlNodeList cnList = (elemList[i].ChildNodes);
        for (int j = 0; j < cnList.Count; j++)
        {
                string name = cnList[j].Name;
                if (!nodesNames.Contains(name))
                        nodesNames.Add(name);
        }
}

And this is an easy sample of the XML:这是 XML 的简单示例:

<?xml version='1.0' encoding='UTF-8'?>
<parentlist>
        <parent>
                <firstchild>someValue</firstchild>
                <secondchild>someValue</secondchild>
        </parent>
        <parent>
                <firstchild>someValue</firstchild>
                <secondchild>someValue</secondchild>
                <thirdchild>someValue</thirdchild>
        </parent>
</parentlist>

To resume:恢复:

  • in the first case i obtain nodesNames = ["parent", "firstchild", "secondchild", "thirdchild"]在第一种情况下,我获得 nodesNames = ["parent", "firstchild", "secondchild", "thirdchild"]
  • in the second case i obtain nodesNames = ["firstchild", "secondchild", "thirdchild"]在第二种情况下,我获得 nodesNames = ["firstchild", "secondchild", "thirdchild"]

I just want to fix the first to obtain the same result as the second.我只想修复第一个以获得与第二个相同的结果。

Try following:尝试以下:

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

namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
           XDocument doc = XDocument.Load(FILENAME);
           XElement parentlist= doc.Root;
           List<string> descendents = parentlist.Descendants().Where(x => x.HasElements).Select(x => string.Join(",", x.Name.LocalName, string.Join(",", x.Elements().Select(y => y.Name.LocalName)))).ToList();


        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM