具有行号作为属性值的Xattribute

时间:2014-01-09 10:18:01

标签: c# xml linq linq-to-xml

在列表seriesDetails的帮助下,使用LINQ Im生成示例XML,

 var result=
              from sc in seriesDetails    
              select new XElement("A",
              new XAttribute("id", sc.A),
              new XElement("B",sc.B),
              new XAttribute("id", sc.B));

如下所述生成示例XML,

<A id="asdf">
    <B id="qwer" />
</A>
<A id="sdfg">
    <B id="bmnm" />
</A >

我需要为sequence标记添加另一个名为<A>的属性,该属性应该是列表seriesDetails中的行号。

预期产出:

<A id="asdf" sequence="1">
    <B id="qwer" />
</A>
<A id="sdfg" sequence="2">
    <B id="bmnm" />
</A >

任何帮助表示赞赏:)

1 个答案:

答案 0 :(得分:1)

您可以使用Enumerable.Select方法提供行号(即元素索引):

  from x in seriesDetails.Select((sc, i) => new { sc, sequence = i + 1 })   
  select new XElement("A",
           new XAttribute("id", x.sc.A),
           new XAttribute("sequence", x.sequence),
           new XElement("B", // do not provide inner text to element B
              new XAttribute("id", x.sc.B)));

另一种选择是在查询之外引入新变量,这将保留行号

int sequence = 0;
var result=
      from sc in seriesDetails 
      select new XElement("A",
               new XAttribute("id", sc.A),
               new XAttribute("sequence", ++sequence),
               new XElement("B", 
                  new XAttribute("id", sc.B)));