Проверка наличия значения в атрибуте имени - PullRequest
1 голос
/ 08 января 2012
<root>
  <data name="ID1"></data>
  <data name="ID2"></data>
</root>
XDocument xmlDoc = XDocument.Load(xmlFile);

bool exists = (from elem in xmlDoc.Descendants("root")
               where elem.Element("data").Attribute("name").Value == "ID1"
               select elem).Any();

Он не видит, что ID1 уже существует. Что я делаю не так?

1 Ответ

4 голосов
/ 08 января 2012

Исходя из того, что вы показали, сначала я должен указать, что фрагмент XML не является допустимым XML.Узлы data не закрыты.

Если предположить, что это действительный документ XML, это в конечном итоге будет зависеть от типа вашей переменной XMLDoc.

Если бы это был XDocument, тогда этот фрагмент кода должен работать, и значение exists будет true.Документ содержит потомка с именем root, и он может заниматься своими делами.

Если с другой стороны это был XElement, то этот фрагмент кода должен завершиться ошибкой, и значение exists будет равноfalse.Переменная XMLDoc уже ссылалась бы на элемент root, и, очевидно, нет никаких потомков с именем root.

Однако вы должны переписать свой запрос, возможно, что-то более похожее на это:

// please follow .NET naming conventions and use lowercase for local variables
XDocument xmlDoc = XDocument.Load(xmlFile);

// iterate over the `data` elements, not the `root` elements
bool exists = (from data in xmlDoc.Element("root").Elements("data")
               where (string)data.Attribute("name") == "ID1"
               select data).Any();
// using the cast is a personal style choice
// using `XAttribute.Value` is fine too in this case
...