Просто быстрый вопрос относительно различия между xpath's 'не' и'! =' в следующем содержании.
Взятие XML:
<years>
<year value="2010"></year>
<year value="2010"></year>
<year value="2010"></year>
<year value="2009"></year>
</years>
Я хочу выбрать уникальные годы. Я изо всех сил пытался некоторое время достигнуть этого, но справился в конце, но любопытным способом, которым я не ожидал.
Следующий xpath корректен для моего намерения и возвращает два уникальных узла года 2009 и 2010.
years/year[not(@value = preceding-sibling::year/@value)]
Следующий только возвращает 2009-летний узел.
years/year[@value != preceding-sibling::year/@value]
Единственная разница между ними! = и не операторы. Я размышлял об этом некоторое время, и я не могу найти различие, которое я мог удовлетворительно объяснить кому-либо еще.
Возможно, кто-то мог помочь.
Удачи
Steve
Второй пример не работает, потому что, если вы примените его к каждому из первых трех узлов, он никогда не совпадет. Для первого <год>
нет предшествующего брата или сестры, значение которого можно было бы попытаться сравнить, поэтому оно не соответствует. Для второго и третьего их предыдущий узел имеет одинаковое значение, поэтому проверка на отсутствие равенства не выполняется и снова не приводит к совпадению.
Версия not (...)
работает, потому что в первом узле все @value = previous-sibling :: year / @ value
не работает из-за отсутствия предыдущий брат, и этот сбой инвертируется , а не
, давая вам совпадение на первом узле.
"Сильно типизированный" в данном случае означает, что Visual Studio пытается создать объектную модель для использования на основе имен ресурсов.
Например, у вас есть файл ресурсов с URL-адресами, указывающими на ваши любимые веб-сайты. ваши ресурсы являются чем-то вроде:
, когда генерируемый ресурс используется для строгого ввода этой информации, вы получите объектную модель, которую можно назвать так:
строка
строка msUrl = Resources.Microsoft;
Если в имени ресурса имеется точка, генератор кода не может использовать ее, поскольку создаст недопустимые имена в объекте Resources. для примера:
это будет недопустимым, так как при попытке создать ресурс с именем Resources.Asp.NET
с строгой типизацией переменная, поле или свойство имеют определенный тип, а не только Объект
.
public class User
{
public String FirstName { get; set; } // Strongly typed
public Object LastName { get; set; } // Weakly typed
}
При использовании ресурсов со строгой типизацией создается код со свойствами со строгой типизацией для всех ресурсов. В этом случае имя ресурса используется в качестве имени свойства, поэтому оно должно быть допустимым именем свойства C #. Пример МБ _ ArchiveRestore.cs _ 11
содержит точку и, следовательно, не является допустимым именем свойства. Генератор кода заменит точку на знак подчеркивания, чтобы сделать имя действительным, и выдаст описанное предупреждение, чтобы сообщить вам об этом.
a! = b
и not (a = b)
СИЛЬНО ОТЛИЧАЮТСЯ из спецификации для XPath 1,0:
Если сравниваются оба объекта: node-sets, тогда сравнение будет true тогда и только тогда, когда имеется узел в первый набор узлов и узел в второй узел установлен так, что результат выполнения сравнения на строковые значения двух узлов правда.
это означает, что (a = b) для наборов узлов является истинным, если существует совпадение между любым элементом в a и b.
(a! = b) означает, что какой-либо элемент в a НЕ соответствует какому-либо элементу в b. таким образом, для узлов A = (1, 2), B = (1, 2). BOTH a = b и a! = b возвращает значение true.
В вашем случае то, что происходит, это то, что (2010! = пустой набор)
всегда ложь, в то время как
нет (2010 = пустой набор)
всегда истина. Подумайте о правилах сопоставления, как описано выше.
Я не профессионал в xpath, но думаю, что "not" возвращает инвертированное значение содержащего объекта, а! = Возвращает значение сравнения между две сравниваемые вещи