[英]LINQ to add Xattribute using loop
這是我的示例XML,
<A>
<B id="ABC">
<C name="A" />
<C name="B" />
<C name="C" />
<C name="G" />
</B>
<B id="ZYZ">
<C name="A" />
<C name="B" />
<C name="C" />
<C name="D" />
</B>
</A>
我需要循環在父<A>
下的每個<B>
節點,並為每個<B>
的<C>
標記添加一個名為Sno
的序列號Xattribute
,如下所示,
<A>
<B id="ABC">
<C name="A" Sno ="1" />
<C name="B" Sno ="2"/>
<C name="C" Sno ="3"/>
<C name="G" Sno ="4"/>
</B>
<B id="ZYZ">
<C name="A" Sno ="1"/>
<C name="B" Sno ="2"/>
<C name="C" Sno ="3"/>
<C name="D" Sno ="4"/>
</B>
</A>
使用以下c#代碼,
var final = from x in afterGrouping.Descendants("A").Descendants("B").Select((sc, i) => new {sc, sequence = i + 1})
select new XElement("C",
new XAttribute("id", x.sc.Element("C").Attribute("id").Value),
new XAttribute("sequence", x.sequence));
使用循環來更改當前文檔可能比重新設計一個更容易:
foreach (XElement b in xDoc.Descendants("B"))
{
int seq = 1;
foreach (XElement c in b.Elements("C"))
c.Add(new XAttribute("Sno", seq++));
}
這樣的事情應該可以解決問題:
using System.Linq;
using System.Xml.Linq;
namespace ConsoleApplication19
{
class Program
{
static void Main(string[] args)
{
const string xml = @"<A><B id='ABC'><C name='A' /><C name='B' /><C name='C' /><C name='G' /></B><B id='ZYZ'><C name='A' /><C name='B' /><C name='C' /><C name='D' /></B></A>";
var doc = XDocument.Parse(xml);
var bs = doc.Descendants("B");
foreach (var r in bs)
{
var cs = r.Descendants("C");
var xElements = cs as XElement[] ?? cs.ToArray();
for (var i = 1; i <= xElements.Count(); i++)
{
var c = xElements.ElementAt(i-1);
c.SetAttributeValue("Sno", i);
}
}
var resultingXml = doc.ToString();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.