C#Linq to XML检查元素是否存在

时间:2009-06-24 16:59:09

标签: c# xml linq linq-to-xml

我有一个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节点的number子节点(用于验证目的,以避免插入重复数据)。

关于潜在解决方案的任何建议?

编辑: 该元素将与输入字符串进行比较。例如if(inputNumber == xmlDocNumber){//不插入新元素}

3 个答案:

答案 0 :(得分:42)

我建议使用Count()略有不同 - 使用Any()。优点是Any()可以在任何匹配时立即停止:

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

在这种情况下它不会有太大的可能性,但是如果Count()可能需要计算一百万次点击只是为了告诉你至少有一次,这是一个有用的技巧。我会说这也是你所说的更明确的指标。

答案 1 :(得分:1)

假设您的数字是某种规范化形式,并且您的XML被加载到XmlDocument或其他类似的,最简单的非LINQ方法是使用XPath查询:

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

答案 2 :(得分:0)

您可以应用一个XSL文档,该文档通过循环SMS节点来转换数据,并排除任何具有重复的Number / text()值的文件

检查会是这样的:

<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>