如何使用带元素的元素计数向XML添加属性

时间:2010-11-03 15:07:24

标签: c# xml linq

xml有许多NEWRECORDS,它们有一些普通元素,后面跟着包含元素的元素。具有子元素的元素可以出现在从0到无穷大的任何位置,并且需要接收名为count的属性,该属性在NEWRECORD中出现。现在我发现你可以对元素id进行计数,你可以使用linq来表示从某个层开始执行它,但这些元素都不是必需的,其中大约有15个,这意味着要搜索15次?或者有一种简单的方法可以向xml添加计数吗?

我添加了xml,但删除了大量信息以保持可读性。简而言之,NAME和YEAR是不需要计数的元素,因为它们对于NEWRECORD是唯一的并且没有子元素(并且是必需的)。其他人需要一个count属性(并且会有子元素),即使只有1也可能丢失。

<NEWFILE>
    <NEWRECORD num="343">
        <NAME>Single Scheme</NAME>
        <YEAR>2005</YEAR>
        <SPS></SPS>
        <SPS></SPS>
        <SPS></SPS>
        <SPS></SPS>
        <SPS></SPS>
        <MODULATION_2005></MODULATION_2005>
        <MODULATION_2005></MODULATION_2005>
        <MODULATION_2005></MODULATION_2005>
        <ADDITIONAL></ADDITIONAL>
        <NOTES></NOTES>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
    </NEWRECORD>
        <NEWRECORD num="344">
        <NAME>Single Scheme</NAME>
        <YEAR>2005</YEAR>
        <SPS></SPS>
        <SPS></SPS>
        <MODULATION_2005></MODULATION_2005>
        <ADDITIONAL></ADDITIONAL>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
        <PART_C2_HISTORY></PART_C2_HISTORY>
    </NEWRECORD>
</NEWFILE>

1 个答案:

答案 0 :(得分:0)

通过一些反复试验和使用各种LINQ我做了一个方法。考虑到我是一名LINQ新手而且我几乎找不到任何关于我所做的事情的信息(我从here得到了一些帮助),我对结果感到非常满意并认为它可能对其他人有用。我也可以对此做出任何改进吗?

    public XDocument FormatcountPreProcData(XDocument inputDoc)
    {
        if (inputDoc != null)
        {
            var elementsToChange = inputDoc.Elements("NEWFILE").Elements("NEWRECORD").Elements();

            foreach (var element in elementsToChange)
            {
                if (element.Descendants().Any())
                {
                    Int32 count = inputDoc.Elements("NEWFILE").Elements("NEWRECORD").Elements(element.Name.ToString()).Count();
                    element.Add(new XAttribute("count", count));
                }
            }
        }
        return inputDoc;
    }