С# 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) {//Не вставлять новый элемент}
Ответы
Ответ 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>