我有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
}
有什么方法可以实现这个目标吗?
谢谢你的帮助。
答案 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标记中的值数量有任何关联,而且您描述的输入和输出之间存在差异。