我有 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
}
有什么办法可以实现吗?
谢谢你的帮助。
最佳答案
Linq 方法 SelectMany允许您为标签集合中的每个元素返回一个新的元素集合。您可以将其与用于将 id 标记值解析为 id 集合的函数结合使用,以获得您描述的功能。
例如
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 标记中的值的数量有任何关联并不完全清楚,您描述的输入和输出之间存在差异。
关于c# - 从逗号分隔的属性值创建新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214028/