根据另一个标记值XML

时间:2016-09-28 08:24:43

标签: c# xml linq

我有一个非常复杂的XML,我需要检查一个特定元素是否只存在于XML的每个子元素中一次。

    <?xml version="1.0" encoding="UTF-8"?>
<deal>
   <commercial>
      <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 />
   </commercial>
   <commercial />
   <commercial />
</deal>

当party标记具有role_type = PRIMARY时,每个商业标记应仅包含一个listingagent标记。

对于每个广告,我需要选择Primary类型的派对,然后检查listingagents标签,它应该只包含一个子列表。

3 个答案:

答案 0 :(得分:0)

使用XML Schema.xsd并限制您的发生:

例如:

<xs:element name="listingagents" maxOccurs="unbounded" type="listingagentsType"/>

 <xs:complexType name="listingagentsType">
   <xs:sequence>
     <xs:element name="listingagent" type="parameterType" maxOccurs="1"/>
   </xs:sequence>

答案 1 :(得分:0)

XElement xml = //...
bool xmlIsInvalid = xml.Elements("commercial")
    .Select(c => c.Elements("party")
    .Single(p => p.Element("role_detail").Element("role_type").Value == "Primary"))
    .Any(p => p.Element("listingagents").Elements("listingagent").Count() > 1);

对于每个commercial元素,请获取partyrole_type的单个子Primary元素。如果这些party元素中的任何一个在listingagent中包含多于listingagents,则返回true。

请注意,此解决方案假定您的XML结构有很多内容 - 即party始终会有一个子role_detail元素,listingagents将始终至少有一个listingagent等等。

答案 2 :(得分:0)

我喜欢使用XDocument(System.Xml.Linq)查询XML节点。我会首先找到有超过1个上市代理的无效主要派对,并从那里开始......

XDocument doc = XDocument.Parse(File.ReadAllText("XMLFile1.xml"));
var allParties = doc.Descendants("commercial").Elements("party");

// invalid primary parties with more than 1 listing agent
var invalidPrimaries = allParties.Where(p => p.Element("role_detail")?.Value.ToUpper() == "PRIMARY" && 
                                             p.Element("listingagents")?.Elements("listingagent").Count() > 1);

var validParties = allParties.Except(invalidPrimaries);
var validCommericals = validParties.Select(p => p.Parent).Distinct().ToList();
相关问题