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



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

8 ответов:

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

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

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

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

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

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

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

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

если все, что вам нужно, это имена, используйте 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");

использовать

item.Attributes["Name"].Value;

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

если вы используете chldNode как XmlElement вместо XmlNode, вы можете использовать

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

The возвращаемое значение будет пустой строкой, если имя атрибута не существует.

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

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> теги и затем цикл через них и прочитать атрибут "имя".

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

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

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

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

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

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

Comments

    Ничего не найдено.