C#的LINQ to XML检查是否存在元素(C# Linq to XML check if ele

2019-06-24 02:01发布

我有一个XML文档如下:

<Database>
 <SMS>
   <Number>"+447528349828"</Number> 
   <Date>"09/06/24</Date> 
   <Time>13:35:01"</Time> 
   <Message>"Stop"</Message> 
 </SMS>
 <SMS>
   <Number>"+447528349828"</Number> 
   <Date>"09/06/24</Date> 
   <Time>13:35:01"</Time> 
   <Message>"Stop"</Message> 
 </SMS>
</Database>

我想检查父SMS节点的多个子节点是否文档中存在(为了进行验证,以避免插入重复数据)。

在一个潜在的解决方案有什么建议?

编辑:元件将相对于输入字符串。 例如,如果(inputNumber == xmlDocNumber){//不要插入新元素}

Answer 1:

我会建议一个稍微不同的策略来使用Count() -使用Any() 其优点是,任何()可以,因为它得到任何比赛都就立即停止:

var smsWithNoNumber = main.Descendants("SMS")
                          .Where(x => !x.Elements("Number").Any());

在这种情况下,它不会有太大胜算,但在情况下, Count()可能需要数百万的点击量只是告诉你,有至少一个,这是一个有用的技巧就知道了。 我会说这也是你的意思更清晰的指示。



Answer 2:

假设你有你的一些规范化形式的号码和你的XML被加载到一个XmlDocument或一些这样的,最简单的非LINQ的方式来做到这一点是与XPath查询:

string pattern = String.Format("/Database/SMS/Number[. = '{0}']", number);
if (myDoc.SelectSingleNode(pattern) != null)
{
   // number already exists in document
}


Answer 3:

您可以申请由通过SMS节点的循环,但不包括转换数据的XSL文件的任何具有重复号码/文()值

检查将是这样的:

<xsl:template match="SMS">
<xsl:variable name="parentNode" select="." />
<xsl:if test="preceding-sibling::SMS/Number/text()=$parentNode/Number/text()">
.....include a copy of node......
</xsl:if>
  </xsl:template>


文章来源: C# Linq to XML check if element exists