基于条件的XML的每个子元素内的唯一元素

时间:2016-09-28 06:10:53

标签: c# xml linq

我的要求是每个商业广告代码中的每个role_type主要应该只有一个listingagent TAG。

<deal>
<commercial>
<party></party>
<party>
<role_detail>
    <role_type>Primary</role_type>
</role_detail>
<listingagents>
    <listingagent>1</listingagent>
    <listingagent>2</listingagent>
</listingagents>
</party>
<party>
<role_detail>
    <role_type>Secondary</role_type>
</role_detail>
<listingagents>
    <listingagent>1</listingagent>
</listingagents>
</party>
<party></party>
</commercial>
<commercial>


</commercial>
<commercial>


</commercial>
</deal>

如果有多个我需要引发错误。

我尝试的代码如下

var duplicates = doc.Descendants("Commercial")
                                    .Select(c => c.Descendants("listingAgent"))
                                    .GroupBy(c => c.ToString())
                                    .Where(g => g.Count() > 1)
                                    .Select(g => g.First())
                                    .ToList();


 if (duplicates.Any(c => c.Count() > 1))
{
   //show error
}

1 个答案:

答案 0 :(得分:2)

如果您的约束条件是每个listingAgent元素中只有一个commercial元素,则非常简单:

var broken = doc.Descendants("commercial")
                .Any(c => c.Elements("listingAgent").Count() != 1);

确保元素是唯一的。例如,根据该要求,这个XML很好:

<deals>
    <commercial>
       <listingAgent>1</listingAgent>
    </commercial>  
    <commercial>
       <listingAgent>1</listingAgent>
    </commercial> 
    <commercial>
       <listingAgent>1</listingAgent>
    </commercial>  
<deals>

此处的每个commercial元素只有一个listingAgent子元素。他们都有相同的价值,但这不是所述要求的一部分。如果你想要唯一性,那就是一个不同的要求 - 而且可以独立于listingAgent个孩子的数量。例如,这符合唯一性,但不是&#34;恰好是一个孩子&#34;要求:

<deals>
    <commercial>
       <listingAgent>1</listingAgent>
       <listingAgent>2</listingAgent>
    </commercial>  
    <commercial>
    </commercial> 
<deals>