XML,
<A>
<B id = "1">
<R>
<C id="ABC" />
</B>
<B id = "2" >
<R>
<C id="ABC" />
</B>
<B id = "3" >
<R>
<C id="XYZ" />
</B>
<B id = "4">
<R>
<C id="XYZ" />
</B>
<B id = "5">
<R>
<C id="QWE" />
</B>
</A>
我需要在它的父<C>
节点下删除类似的连续<B>
,输出应该是类似的,
<A>
<B id = "1">
<R>
<C id="ABC" />
</B>
<B id = "2">
<R>
</B>
<B id = "3">
<R>
<C id="XYZ" />
</B>
<B id = "4">
<R>
</B>
<B id = "5">
<R>
<C id="QWE" />
</B>
</A>
如果只能通过实际操作或使用linq-to-xml来实现,我就不会使用。
任何帮助表示赞赏:)
答案 0 :(得分:1)
可能有一种更优雅的方式来执行此操作,但这是一种简单的方法:循环遍历所有B
元素并跟踪之前的C
元素。此示例是您所拥有的内容与使用字典的更灵活的设计之间的混合,以防您在A
下有多种类型的元素来跟踪。如果它真的像你的例子一样简单,那就去掉字典,然后使用XElement previousC
。
//to get this to work in Linq to XML, need to terminate the R nodes
var xml = XDocument.Parse(@"<A>
<B id = ""1"">
<R/>
<C id=""ABC"" />
</B>
<B id = ""2"" >
<R/>
<C id=""ABC"" />
</B>
<B id = ""3"" >
<R/>
<C id=""XYZ"" />
</B>
<B id = ""4"">
<R/>
<C id=""XYZ"" />
</B>
<B id = ""5"">
<R/>
<C id=""QWE"" />
</B>
</A>");
Dictionary<string, XElement> previousCElements = new Dictionary<string, XElement>();
XElement currentC, previousC;
foreach(var node in xml.Descendants("B"))
{
if (!previousCElements.ContainsKey(node.Name.LocalName))
{
previousCElements[node.Name.LocalName] = node.Element("C");
}
else
{
previousC = previousCElements[node.Name.LocalName];
currentC = node.Element("C");
if (previousC.Attribute("id").Value.Equals(currentC.Attribute("id").Value, StringComparison.InvariantCultureIgnoreCase))
{
currentC.Remove();
}
previousCElements.Remove(node.Name.LocalName);
}
}
产生的XML:
<A>
<B id="1">
<R />
<C id="ABC" />
</B>
<B id="2">
<R />
</B>
<B id="3">
<R />
<C id="XYZ" />
</B>
<B id="4">
<R />
</B>
<B id="5">
<R />
<C id="QWE" />
</B>
</A>