Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中只删除顺序重复的XML元素#_C#_Linq To Xml - Fatal编程技术网

C# 在C语言中只删除顺序重复的XML元素#

C# 在C语言中只删除顺序重复的XML元素#,c#,linq-to-xml,C#,Linq To Xml,因此,我有一个XML元素列表,我希望遍历这些元素并删除重复的元素。随着循环的进行,如果在当前索引和索引+1之间发现重复项,则需要删除索引+1,并且应与索引进行比较的下一个值应为索引+2,依此类推,直到序列中没有重复项。如果与索引相比,索引+3不是重复的,那么循环应该像常规的侦察一样进行顺序重复 <Update> <Properties id="42" rotation="0.00 0.00 -0.01" /> </Update> <Update&g

因此,我有一个XML元素列表,我希望遍历这些元素并删除重复的元素。随着循环的进行,如果在当前索引和索引+1之间发现重复项,则需要删除索引+1,并且应与索引进行比较的下一个值应为索引+2,依此类推,直到序列中没有重复项。如果与索引相比,索引+3不是重复的,那么循环应该像常规的侦察一样进行顺序重复

<Update>
  <Properties id="42" rotation="0.00 0.00 -0.01" />
</Update>

<Update>
  <Properties id="42" rotation="0.00 0.00 -0.01" />
</Update>

<Update>
  <Properties id="42" rotation="0.00 0.00 -0.01" />
</Update>

<Update>
  <Properties id="42" rotation="2.42 2.24 -4.42" />
</Update>

我目前正在使用LinQ操作XDocument元素。目前,我使用If语句将索引与索引+1进行比较,如果它们相同,则删除索引+1。当i++;然后索引现在位于先前删除属性的位置,因此,如果下一个索引+1现在包含与索引-2相同的值(因为我们在下一次迭代中将其增加了1),则不会注册顺序副本。电流输出:

if(xmlementlist.Count()>1){
//开始循环所有修改
对于(int i=0;i

一个序列中不应该有两个重复项。如果文件本身存在重复项,则可以,但index+1不应包含与index相同的值。预期产出:

<Update>
  <Properties id="42" rotation="0.00 0.00 -0.01" />
</Update>

<Update>
  <Properties id="42" />
</Update>

<Update>
  <Properties id="42" />
</Update>

<Update>
  <Properties id="42" rotation="2.42 2.24 -4.42" />
</Update>

当前方法的问题在于,您过早地推进了所关注的要素。在匹配的第一次出现时,您应该将原始的第一项与后面的下一项进行比较。您只查看相邻的项目

您可以手工创建一个xpath查询,该查询可以非常容易地选择与上一个查询具有相同id和旋转的
元素

//Update[preceding-sibling::Update/Properties/@id      =Properties/@id
     and preceding-sibling::Update/Properties/@rotation=Properties/@rotation]
然后根据需要修改这些元素

var xpath = "//Update[preceding-sibling::Update/Properties/@id=Properties/@id and preceding-sibling::Update/Properties/@rotation=Properties/@rotation]";
var fixUpdates = doc.XPathSelectElements(xpath);
var fixProperties = fixUpdates.Elements("Properties");
var removeMe = fixProperties.Attributes("rotation");
removeMe.Remove();
var xpath = "//Update[preceding-sibling::Update/Properties/@id=Properties/@id and preceding-sibling::Update/Properties/@rotation=Properties/@rotation]";
var fixUpdates = doc.XPathSelectElements(xpath);
var fixProperties = fixUpdates.Elements("Properties");
var removeMe = fixProperties.Attributes("rotation");
removeMe.Remove();