Как прочитать значение атрибута из XmlNode в C #? - PullRequest
98 голосов
/ 21 октября 2009

Предположим, у меня есть 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>

Ответы [ 8 ]

188 голосов
/ 21 октября 2009

Попробуйте это:

string employeeName = chldNode.Attributes["Name"].Value;
41 голосов
/ 03 января 2013

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

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

   throw new InvalidOperationException("Node 'Name' not found.");
}
17 голосов
/ 21 октября 2009

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

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

    foreach (XmlAttribute att in item.Attributes)
    {
        // attribute stuff
    }
}
3 голосов
/ 29 мая 2015

, если вам нужны только имена, используйте вместо этого 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");
3 голосов
/ 21 октября 2009

Используйте

item.Attributes["Name"].Value;

чтобы получить значение.

2 голосов
/ 19 мая 2016

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

1 голос
/ 19 марта 2017

Еще одно решение:

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

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

Также исключается исключение, когда ожидаемый атрибут attributeName фактически не существует.

1 голос
/ 27 апреля 2016

Вы также можете использовать это;

string employeeName = chldNode.Attributes().ElementAt(0).Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...