Извлечение атрибутов из XML
-
21-09-2019 - |
Вопрос
Почему выполняется этот код...
XmlDocument doc = new XmlDocument();
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<BaaBaa>
<BlackSheep HaveYouAny=""Wool"" />
</BaaBaa>";
doc.LoadXml(xml);
XmlNodeList nodes = doc.SelectNodes("//BaaBaa");
foreach (XmlElement element in nodes)
{
Console.WriteLine(element.InnerXml);
XmlAttributeCollection attributes = element.Attributes;
Console.WriteLine(attributes.Count);
}
Выдать следующий вывод в командной строке?
<BlackSheep HaveYouAny="Wool" />
0
То есть, не должен attributes.Count
вернуть 1?
Решение
Когда ты позвонишь SelectNodes
с помощью "//BaaBaa" он возвращает все элементы "BaaBaa".
Как вы можете видеть из вашего собственного документа, BaaBaa не имеет атрибутов, это элемент "BlackSheep", который имеет единственный атрибут "HaveYouAny".
Если вы хотите получить количество атрибутов дочерних элементов, вам нужно перейти к нему с узла, на котором вы находитесь, при переборе узлов.
Другие советы
element.Attributes
содержит атрибуты самого элемента, а не его дочерних элементов.
С тех пор как BaaBaa
элемент не имеет никаких атрибутов, он пустой.
В InnerXml
свойство возвращает XML содержимого элемента, а не самого элемента.Следовательно, у него действительно есть атрибут.
<BlackSheep HaveYouAny=""Wool"" /> // innerXml that includes children
<BaaBaa> // is the only node Loaded, which has '0' attributes
решение
XmlAttributeCollection attributes = element.FirstChild.Attributes;
Будет выдан следующий требуемый результат
<BlackSheep HaveYouAny="Wool" />
1