2009-06-24 67 views
23

我有一个XML文档如下:C#的LINQ to 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){//不要插入新元素}

+0

你可以给我们一些样品(伪?)代码来提供你需要的上下文和更清晰的图片> – 2009-06-24 17:13:20

+0

这些工作都不行! – Goober 2009-06-29 15:25:56

+1

示例代码将如何帮助..........在xml文档中查找任何指定的元素.......除了我所拥有的内容,我还可能给你什么? – Goober 2009-06-29 15:26:50

回答

41

我会建议使用Count()稍微不同 - 使用Any()。其优点是,任何()能尽快停止,因为它得到任何比赛都:

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

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

+0

如何使用它进行检查?对不起,我还在熟悉LINQ – Blackator 2012-09-05 06:19:02

0

您可以应用是通过短信节点的循环,但不包括转换数据的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> 
1

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

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