Come leggere il valore dell'attributo da XmlNode in C #?


114

Supponiamo che io abbia un XmlNode e desidero ottenere il valore di un attributo denominato "Name". Come lo posso fare?

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)
             { 

             }
         }
      }
}

Documento XML:

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

Risposte:


214

Prova questo:

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

Modifica: come sottolineato nei commenti, questo genererà un'eccezione se l'attributo non esiste. Il modo sicuro è:

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

34
Stai attento con questo approccio. Penso che se l'attributo non è presente, l'accesso al membro Value causerà un'eccezione di riferimento nullo.
Chris Dunaway,

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

7
@Omidoo Questo approccio ha lo stesso problema, ad esempio con <a x="1" />, che supera il test. Forse qualcosa del genere var attr = node.Attributes["Name"]; if(attr != null) {...}potrebbe funzionare.
Joel Peltonen

Dai un'occhiata alla mia risposta di seguito , che aggira il problema NullException ed è, forse ?, più sicura da usare.
Marco7757

44

Per espandere la soluzione di Konamiman (inclusi tutti i controlli nulli pertinenti), questo è quello che ho fatto:

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

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

6
Un modo abbreviato per non ottenere un errore per i null è node.Attributes? ["Name"] ?. Value
brandonstrong

1
Anche vero, anche se l'unica cosa che sottolineerò è che mentre puoi farlo in una riga (rendendolo buono per un compito o qualcosa del genere), è un po 'meno flessibile in termini di controllo quando lanci un'eccezione o gestisci in altro modo il caso in cui il nodo non ha attributi.
Ari Roth

1
Concordato. Chiunque utilizzi la modalità abbreviata dovrebbe sempre assicurarsi che non causi problemi a valle.
brandonstrong

17

puoi scorrere tutti gli attributi come fai con i nodi

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

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

questo sarà più preferibile .. :)
SHEKHAR SHETE

4

se tutto ciò di cui hai bisogno sono i nomi, usa invece xpath. Non è necessario eseguire l'iterazione da soli e verificare la presenza di 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");

I metodi sopra non hanno funzionato per il mio XML (anche se vorrei che lo avessero fatto). Questo metodo fa! Grazie!
Frecklefoot

4

Se usi chldNodeas XmlElementinvece di XmlNode, puoi usare

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

Il valore restituito sarà solo una stringa vuota , nel caso in cui il nome dell'attributo non esiste.

Quindi il tuo loop potrebbe assomigliare a questo:

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

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

Questo selezionerà tutti i nodi <node>circondati da <Node><N0de></N0de><Node>tag e successivamente li attraverserà e leggerà l'attributo "Nome".


3

Uso

item.Attributes["Name"].Value;

per ottenere il valore.


1

Puoi anche usare questo;

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

1

Ancora un'altra soluzione:

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

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

Inoltre evita l'eccezione quando l'attributo previsto in attributeNamerealtà non esiste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.