我有一个非常复杂的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标签,它应该只包含一个子列表。
答案 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
元素,请获取party
为role_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();