XML两层结构下的特定产品节点存在性查询问题
XML两层结构下的特定产品节点存在性查询问题
嘿,我看你已经搞定了提取产品编号和序列号的部分,但还没把上层的status条件整合进去对吧?其实不用分开遍历,咱们直接从<result>节点入手,把所有条件一次性写到LINQ查询里就行,这样代码更简洁高效~
先理清楚你的需求:要找的是上层节点status为ACTIVE,同时其下属的<productKey>节点满足productNumber=90且sequenceNumber=1的记录是否存在。针对这个需求,我们可以直接在查询<result>节点时就把所有条件都加上:
var doc = XDocument.Parse(soapRequestResponse.Response); // 一步到位判断是否存在符合条件的记录 bool exists = doc.Root.Descendants("result") .Any(result => // 先检查当前result的status是否为ACTIVE result.Element("status")?.Value.Trim() == "ACTIVE" && // 再检查当前result下是否有符合要求的productKey result.Descendants("productKey").Any(productKey => productKey.Element("productNumber")?.Value.Trim() == "90" && productKey.Element("sequenceNumber")?.Value.Trim() == "1" ) );
这段代码的逻辑解释:
Descendants("result"):先获取XML里所有的顶层<result>节点Any():LINQ里的这个方法专门用来判断是否存在符合条件的元素,比手动遍历更高效,代码也更简洁?.:这里用空条件运算符是为了避免空引用异常——如果某个<result>没有<status>节点,或者某个<productKey>缺少productNumber/sequenceNumber,代码会直接返回false而不是报错- 两层
Any()嵌套:第一层判断status是否符合,第二层判断当前result下的productKey是否满足编号要求
如果之后你还需要获取符合条件的<result>节点的详细信息,也可以稍微修改代码:
// 获取所有符合条件的result节点详情 var matchingResults = doc.Root.Descendants("result") .Where(result => result.Element("status")?.Value.Trim() == "ACTIVE" && result.Descendants("productKey").Any(productKey => productKey.Element("productNumber")?.Value.Trim() == "90" && productKey.Element("sequenceNumber")?.Value.Trim() == "1" ) ) .ToList(); // 判断是否存在 bool exists = matchingResults.Any();
这样就完美解决了你既要判断产品编号序列号,又要关联上层status的需求啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

