gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:04 25 4
gpt4 key购买 nike

我有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com