Как прочитать значение атрибута из XmlNode в C #?


115

Предположим, у меня есть XmlNode, и я хочу получить значение атрибута с именем «Name». Как я могу это сделать?

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
Будьте осторожны с этим подходом. Я думаю, что если атрибут отсутствует, то доступ к члену Value вызовет исключение Null Reference Exception.
Крис Данауэй,

3
if (node.Attributes! = null) string employeeName = chldNode.Attributes ["Name"]. Value;
Omidoo

7
@Omidoo У этого подхода та же проблема, например, с <a x="1" />, который проходит тест. Возможно, что-то вроде var attr = node.Attributes["Name"]; if(attr != null) {...}может сработать.
Joel Peltonen

Взгляните на мой ответ ниже , который позволяет обойти проблему 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
Сокращенный способ не получать ошибку для значений NULL - это node.Attributes? ["Name"] ?. Value
brandonstrong

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

1
Согласовано. Любой, кто использует сокращенный способ, всегда должен быть уверен, что он не вызовет проблем ниже по течению.
brandonstrong 03

17

вы можете перебирать все атрибуты, как и с узлами

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

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

так будет предпочтительнее .. :)
ШЕХАР ШЕТ

4

если вам нужны только имена, используйте xpath. Нет необходимости выполнять итерацию самостоятельно и проверять значение null.

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 (хотя я бы хотел, чтобы они были). Этот метод работает! Спасибо!
Frecklefoot,

4

Если вы используете chldNodeas 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>тегами, а затем переберет их и прочитает атрибут «Имя».




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.