从逗号分隔的属性值创建新元素

时间:2017-11-10 00:45:10

标签: c# xml xml-parsing

我有XML。我想基于属性值创建新元素。

以下是XML示例:

<MyRootElement>
 <MyTag id = "1" Range="2"/>
<MyTag id = "2,3" Range="2"/>
</MyRootElement>

我想分离属性值并创建新元素。基本上将上面的内容转换为:

<MyRootElement>
 <MyTag id = "1" Range="2"/>
 <MyTag id = "2" Range="3"/>
 <MyTag id = "3" Range="3"/>
</MyRootElement>

我的最终目标是将每个元素转换为一个对象。我正在做下面的事情来实现同样的目标:

    const string xmlstring = @"<MyRootElement>
     <MyTag id = '1' Range='2'/>
    <MyTag id = '2,3' Range='2'/>
    </MyRootElement>";

                var xmlConfig = XDocument.Parse(xmlstring);
                if (xmlConfig.Root == null) return;

                var tags= xmlConfig.Root.Elements("MyTag");

var temp = tags.Select(t =>
            {
                var id = t.Attribute("Id");
                var range = t.Attribute("Range");
                return new
                {
                    ID = (id != null) ? int.Parse(id.Value) : 0,
                    Range = (range != null) ? int.Parse(range.Value) : 0,
                };
            });

但是如果属性id有多个值,则会失败。 我希望有三个对象作为最终结果,如下所示:

  {
       ID= 1,
       Range = 2
   },
  {
       ID= 2,
       Range = 3
  },
  {
       ID= 3,
       Range = 3
  }

有什么方法可以实现这个目标吗?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

Linq方法SelectMany允许您为标签集合中的每个元素返回一个新的元素集合。您可以将此功能与将id标记值解析为id集合的函数结合使用,以获得所描述的功能。

E.g。

var temp = tags.SelectMany(t =>
            {
                var id = t.Attribute("id");
                var range = t.Attribute("Range");
                var ids = (id != null) ? id.Value.Split(',').Select(int.Parse) : new[] { 0 };
                var rangeValue = (range != null) ? int.Parse(range.Value) : 0;
                return ids.Select(i => new { ID = i, Range = rangeValue });
            });

在您的问题中,并不完全清楚Range的值是否与id标记中的值数量有任何关联,而且您描述的输入和输出之间存在差异。