首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ使用循环添加Xattribute

LINQ使用循环添加Xattribute
EN

Stack Overflow用户
提问于 2014-01-13 10:02:30
回答 2查看 427关注 0票数 1

这是我的示例XML,

代码语言:javascript
复制
 <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>

我需要循环父<B>下的每个<A>节点,并为每个<B>添加一个名为Sno的序列编号Xattribute<C>标记,如下所示,

代码语言:javascript
复制
 <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#代码,

代码语言:javascript
复制
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));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-13 10:19:23

使用循环来更改当前文档可能要比重新投影文档更容易:

代码语言:javascript
复制
foreach (XElement b in xDoc.Descendants("B"))
{
    int seq = 1;
    foreach (XElement c in b.Elements("C"))
        c.Add(new XAttribute("Sno", seq++));
}
票数 4
EN

Stack Overflow用户

发布于 2014-01-13 10:19:06

像这样的事情应该能起作用:

代码语言:javascript
复制
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();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21088417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档