Як читати значення атрибуту з XmlNode в C #?


114

Припустимо, у мене є XmlNode, і я хочу отримати значення атрибута під назвою "Ім'я". Як я можу це зробити?

XmlTextReader reader = new XmlTextReader(path);

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);

foreach (XmlNode chldNode in node.ChildNodes)
{
     **//Read the attribute Name**
     if (chldNode.Name == Employee)
     {                    
         if (chldNode.HasChildNodes)
         {
             foreach (XmlNode item in node.ChildNodes)
             { 

             }
         }
      }
}

Документ XML:

<Root>
    <Employee Name ="TestName">
    <Childs/>
</Root>

Відповіді:


214

Спробуйте це:

string employeeName = chldNode.Attributes["Name"].Value;

Редагувати: Як зазначено в коментарях, це може призвести до виключення, якщо атрибут не існує. Безпечний спосіб:

var attribute = node.Attributes["Name"];
if (attribute != null){
    string employeeName = attribute.Value;
    // Process the value here
}

34
Будьте обережні з таким підходом. Я думаю, якщо атрибут відсутній, то доступ до члена Значення спричинить нульове виняткове посилання.
Кріс Дунавей

3
if (node.Attributes! = null) рядок stringName = chldNode.Attributes ["Ім'я"]. Значення;
Omidoo

7
@Omidoo У такого підходу є те саме питання, як, наприклад <a x="1" />, з тестом, який проходить тест. Можливо, щось подібне var attr = node.Attributes["Name"]; if(attr != null) {...}може спрацювати.
Джоел Пелтонен

Подивіться на мою відповідь нижче , яка обходить проблему NullException і, можливо, є більш безпечною у використанні.
Marco7757

44

Щоб розширити рішення Konamiman (включаючи всі відповідні нульові перевірки), це те, що я робив:

if (node.Attributes != null)
{
   var nameAttribute = node.Attributes["Name"];
   if (nameAttribute != null) 
      return nameAttribute.Value;

   throw new InvalidOperationException("Node 'Name' not found.");
}

6
Скорочений спосіб не отримати помилку для нулів - це node.Atributes? ["Name"]?. Значення
brandonstrong

1
Також вірно, хоча єдине, що я зазначу, це те, що, хоча ви можете це робити в одному рядку (що робить його корисним для завдання або чогось іншого), це трохи менш гнучко в плані контролю, коли ви кидаєте виняток або іншим чином обробляєте випадок, коли вузол не має атрибутів.
Арі Рот

1
Домовились. Кожен, хто використовує скорочений шлях, завжди повинен переконатися, що це не спричинить проблем за течією.
brandonstrong

17

Ви можете переглядати всі атрибути, як ви робите з вузлами

foreach (XmlNode item in node.ChildNodes)
{ 
    // node stuff...

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}

це буде більш кращим .. :)
SHEKHAR SHETE

4

якщо все, що вам потрібно, це імена, використовуйте замість xpath. Не потрібно робити ітерацію самостійно і перевіряти наявність нуля.

string xml = @"
<root>
    <Employee name=""an"" />
    <Employee name=""nobyd"" />
    <Employee/>
</root>
";

var doc = new XmlDocument();

//doc.Load(path);
doc.LoadXml(xml);

var names = doc.SelectNodes("//Employee/@name");

Вищеописані методи не працювали для мого XML (хоча я б хотів, щоб вони були). Цей спосіб робить! Дякую!
Ластовиння

4

Якщо ви використовуєте chldNodeяк XmlElementзамість XmlNode, ви можете використовувати

var attributeValue = chldNode.GetAttribute("Name");

Значення, що повертається буде просто порожній рядок , в разі , якщо ім'я атрибута не існує.

Так ваш цикл може виглядати так:

XmlDocument document = new XmlDocument();
var nodes = document.SelectNodes("//Node/N0de/node");

foreach (XmlElement node in nodes)
{
    var attributeValue = node.GetAttribute("Name");
}

Це дозволить вибрати всі вузли, <node>оточені <Node><N0de></N0de><Node>тегами, а згодом прокрутити їх і прочитати атрибут "Ім'я".


3

Використовуйте

item.Attributes["Name"].Value;

щоб отримати значення.


1

Ви також можете використовувати це;

string employeeName = chldNode.Attributes().ElementAt(0).Name

1

Ще одне рішення:

string s = "??"; // or whatever

if (chldNode.Attributes.Cast<XmlAttribute>()
                       .Select(x => x.Value)
                       .Contains(attributeName))   
   s =  xe.Attributes[attributeName].Value;

Це також уникає винятку, коли очікуваного атрибута attributeNameнасправді не існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.