xml有许多NEWRECORDS,其中包含一些普通元素,后面是带有元素的元素。具有子元素的元素可以出现在从0到无穷大的任何位置,并且需要接收一个名为count的属性,该属性的出现位置在NEWRECORD中。现在我发现你可以对元素id进行计数,你可以使用linq to state从某个层开始计数,但这些元素都不是必需的,大约有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>发布于 2010-11-05 00:50:59
通过一些尝试和各种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;
}https://stackoverflow.com/questions/4088469
复制相似问题