C # Linq to XML проверяет, существует ли элемент - PullRequest
24 голосов
/ 24 июня 2009

У меня есть 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 (для целей проверки, чтобы избежать вставки дублирующих данных).

Какой-нибудь совет относительно потенциального решения?

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

Ответы [ 3 ]

42 голосов
/ 24 июня 2009

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

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

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

1 голос
/ 24 июня 2009

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

string pattern = String.Format("/Database/SMS/Number[. = '{0}']", number);
if (myDoc.SelectSingleNode(pattern) != null)
{
   // number already exists in document
}
0 голосов
/ 24 июня 2009

Вы можете применить 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...