2009-06-24 73 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 
}