簡體   English   中英

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

[英]C# Linq to XML check if element exists

我有一個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){//不插入新元素}

我建議使用Count()稍微不同一點 - 使用Any() 優點是Any()可以在任何匹配時立即停止:

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

在這種情況下它不會有太大的可能性,但是在Count()可能需要計算一百萬次點擊只是為了告訴你至少有一次,這是一個有用的技巧。 我會說這也是你所說的更明確的指標。

假設你有一些規范化形式的數字,並且你的XML被加載到XmlDocument或其中一些,最簡單的非LINQ方法是使用XPath查詢:

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

您可以通過循環SMS節點來應用轉換數據的XSL文檔,並排除任何具有重復的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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM