【问题标题】:Create an id for each node in xml file为xml文件中的每个节点创建一个id
【发布时间】:2016-04-04 06:05:06
【问题描述】:

我有一个如下的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<files>
    <file name="1">
        <file name="4">
            <file name="9">
            </file> 
        </file> 
    </file>
    <file name="2">
    </file>
    <file name="3">
        <file name="5">
            <file name="7">
            </file>
        </file>
        <file name="6">
        </file>
    </file>
</files>

我想使用每个节点的级别为每个节点创建一个 id。

1
1,4
1,4,9
2
3
3,5
3,5,7
3,6

将其保存为列表。对于每个父级,列表中的条目如下:

0
  1
  1,4      
  1,4,9
1
  2
2
  3
  3,5
  3,5,7
  3,6

我使用了以下代码:

using System;
using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {    
        var doc = XDocument.Load("test2.xml");
        var hierarchy = doc.Descendants("file")
                   .Where(x => x.Element("file") == null)
                   .Select(x => x.AncestorsAndSelf("file")
                                 .Reverse()
                                 .Select(f => (int)f.Attribute("name"))
                                 .ToList());

        var step = hierarchy.Select(a => String.Join(", ", a));
    }
}

这个函数可以称为展平 XML 文件中的嵌套节点/子节点。此代码仅生成最后一个节点的列表,就是这样(参见输出)。

1,4,9
2    
3,5,7
3,6

但我更喜欢分别为每个节点设置一个地址/ID。

【问题讨论】:

  • 您的输出似乎包含层次结构,但您正在创建一个平面列表。您希望如何表示该层次结构?目前尚不清楚您要达到的目标。
  • @JonSkeet 请查看编辑后的版本。
  • 你需要一个返回给定节点路径的方法吗?或者您需要一个返回所有展平节点及其路径的方法?
  • @RezaAghaei,我需要一个返回所有扁平节点及其路径的方法。
  • 使用递归方法。将级别传递给递归方法。请参阅以下网页:stackoverflow.com/questions/28976601/…

标签: c# .net xml winforms list


【解决方案1】:

对于每个父级将是列表中的一个条目

你可以使用这样的查询:

var document = XDocument.Load(@"d:\xml.xml");
var list = document.Root
                   .Elements("file")
                   .Select((x, i) => new
                   {
                       Index = i,
                       Nodes = x.DescendantsAndSelf("file")
                               .Select(y => new
                               {
                                   Node = y,
                                   Path = string.Join("-", y.AncestorsAndSelf("file")
                                                .Reverse()
                                                .Select(f => f.Attribute("name").Value))
                               })
                   }).ToList();

这会产生这样的结果:

Index | Node | Path
---------------------
0     | 1    | 1
      | 4    | 1-4
      | 9    | 1-4-9
1     | 2    | 2
2     | 3    | 3
      | 5    | 3-5
      | 7    | 3-5-7
      | 6    | 3-6

我需要一个返回所有展平节点及其路径的方法。

你可以使用这样的查询:

var document = XDocument.Load(@"d:\xml.xml");
var list = document.Root.Descendants("file")
                   .Select(x => new
                   { 
                       Node= x,  
                       Path = string.Join("-",x.AncestorsAndSelf("file")
                                    .Reverse().Select(f => f.Attribute("name").Value))
                   }).ToList();

这将创建一个包含节点和路径的列表:

Node | Path
-------------
1    | 1
4    | 1-4
9    | 1-4-9
2    | 2
3    | 3
5    | 3-5
7    | 3-5-7
6    | 3-6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多