Вопрос

Почему выполняется этот код...

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top