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

标签 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
  }

有什么办法可以实现吗?

谢谢你的帮助。

最佳答案

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/

相关文章:

c# - 实现 IMultiValueConverter 以在单位之间进行转换

C# dllimport 在被 Process.Start 调用时抛出 SEHException

c# - 玻璃表面上的发光标签控件

c - 在 ANSI C 中针对 relax ng 验证 xml

Python 将 xml 转换为 json 需要一个类似字节的对象

java - JAXB 和 JPA,关系

php - 在 PHP 中解析 BIG XML

c# - 通过 TemplateBinding 添加 RoutedEvent

java - SAXParser - 处理 XML 结构中不同级别的具有相同文本的标签

php - 为什么要使用 XML 解析器?