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