Подтвердить что ты не робот

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

Я пытаюсь проверить, существует ли в документе число child node родительского SMS node (для целей проверки, чтобы избежать вставки повторяющихся данных).

Любые советы по потенциальному решению?

EDIT: Элемент будет сравниваться с входной строкой. Например if (inputNumber == xmlDocNumber) {//Не вставлять новый элемент}

4b9b3361

Ответ 1

Я предлагаю немного отличную возможность использовать Count() - использовать Any(). Преимущество в том, что Any() может остановиться, как только он получит какие-либо совпадения:

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

В этом случае он не будет делать много шансов, но в тех случаях, когда Count() может посчитать миллион хитов, просто чтобы сказать вам, что есть хотя бы один, это полезный трюк. Я бы сказал, что это также более четкий показатель того, что вы имеете в виду.

Ответ 2

Предполагая, что у вас есть номер в некоторой канонической форме, и ваш XML загружается в XmlDocument или некоторые из них, самый простой способ, не связанный с LINQ, заключается в запросе XPath:

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

Ответ 3

Вы можете применить 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>