Supposons que j'ai un XmlNode et que je veux obtenir la valeur d'un attribut nommé "Nom". Comment puis je faire ça?
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)
{
}
}
}
}
Document XML:
<Root>
<Employee Name ="TestName">
<Childs/>
</Root>
Essaye ça:
string employeeName = chldNode.Attributes["Name"].Value;
Pour développer la solution de Konamiman (y compris tous les contrôles nuls pertinents), voici ce que j'ai déjà fait:
if (node.Attributes != null)
{
var nameAttribute = node.Attributes["Name"];
if (nameAttribute != null)
return nameAttribute.Value;
throw new InvalidOperationException("Node 'Name' not found.");
}
vous pouvez parcourir tous les attributs comme vous le faites avec des nœuds
foreach (XmlNode item in node.ChildNodes)
{
// node stuff...
foreach (XmlAttribute att in item.Attributes)
{
// attribute stuff
}
}
si vous avez uniquement besoin de noms, utilisez plutôt xpath. Pas besoin de faire l'itération vous-même et de vérifier la valeur 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");
Utilisation
item.Attributes["Name"].Value;
pour obtenir la valeur.
Si vous utilisez chldNode
comme XmlElement
au lieu de XmlNode
, vous pouvez utiliser
var attributeValue = chldNode.GetAttribute("Name");
Le la valeur renvoyée sera simplement une chaîne vide , au cas où le nom de l'attribut n'existe pas.
Donc, votre boucle pourrait ressembler à ceci:
XmlDocument document = new XmlDocument();
var nodes = document.SelectNodes("//Node/N0de/node");
foreach (XmlElement node in nodes)
{
var attributeValue = node.GetAttribute("Name");
}
Ceci sélectionnera tous les nœuds <node>
entourés par les balises <Node><N0de></N0de><Node>
et les parcourera ensuite en boucle pour lire l'attribut "Nom".
Encore une autre solution:
string s = "??"; // or whatever
if (chldNode.Attributes.Cast<XmlAttribute>()
.Select(x => x.Value)
.Contains(attributeName))
s = xe.Attributes[attributeName].Value;
Cela évite également l'exception lorsque l'attribut attendu attributeName
n'existe pas.
Vous pouvez également utiliser ceci;
string employeeName = chldNode.Attributes().ElementAt(0).Name