2016-09-27 89 views
2

我是新来的,特别是将linq转换为xml,并且在尝试遍历结果时遇到问题。我的xml文档具有嵌套在单个父节点中的多个相同名称的节点。通过LINQ检查XML中每个子项中的重复值

示例XML是:

<commercial> 
    <listingAgent>1</listingAgent> 
    <listingAgent>2</listingAgent> 
    <listingAgent>1</listingAgent> 
</commercial> 
<commercial> 
    <listingAgent>1</listingAgent> 
    <listingAgent>2</listingAgent> 
    <listingAgent>3</listingAgent> 
</commercial> 

所以每个商业标签应该是唯一的上市代理值。如果不是,我需要提出一个错误。

真正的XML非常复杂,而且这些标签远没有根。所以,我需要遍历这些然后搜索duplciates

我尝试下面的代码

foreach (XElement e in root.Descendants("listingAgent")) 
{ 
    listerror.Add(e.Value); 
} 

if(listerror.Count != listerror.Distinct().Count()) 
    Then show error 

但我需要这个循环的每个商业工作要做。

回答

2

首先,选择所有的商业节点,然后对于每个节点,您可以使用Select获得代理列表值,这样您将得到一个列表列表,最后您可以应用您之前尝试的相同条件,但现在代理的每个列表:

var result= xdoc.Descendants("commercial") 
       .Select(c=>c.Descendants("listingAgent").Select(e=>e.Value)); 
if(result.Any(e=>e.Count()!= e.Distinct().Count()) 
{ 
    //error 
} 
+0

嗨..抱歉不清楚我的问题,但listingAgent不是一个商业直接的孩子。这会继续吗? –

+0

那么,如果代理商在商业广告中,只需使用'Descendants'而不是'Elements'方法 – octavioccl

+0

嘿,谢谢你。如果我可能会问另一个相关的问题。如何识别标签是否重复?不只是价值,也是标签名称?示例如何在Commercial标签中存在多个listingagent标签时抛出错误? –