2010-11-03 47 views
0

xml有许多具有一些正常元素的NEWRECORDS,后面是具有元素的元素。具有子元素的元素可以发生在0到无穷的任何地方,并且需要接收一个名为count的属性,该属性具有NEWRECORD中的出现次数。现在我发现你可以对元素id进行计数,你可以使用linq来指定从某个图层开始,但是这些元素都不是必需的,并且大约有15个元素,这是否意味着搜索15次?还是有一种简单的方法来添加一个计数到XML?如何将元素添加到具有元素的该元素的计数的XML

我已经添加了xml,但删除了很多信息以保持其可读性。简而言之,NAME和YEAR是不需要计数的元素,因为它们对于NEWRECORD是唯一的,并且没有子元素(并且是必需的)。其他人需要计数属性(并且会有子元素),即使只有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> 

回答

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; 
    }