web-dev-qa-db-fra.com

Lire l'attribut XML à l'aide de XmlDocument

Comment lire un attribut XML à l'aide de XmlDocument de C #?

J'ai un fichier XML qui ressemble à ceci:

<?xml version="1.0" encoding="utf-8" ?>
<MyConfiguration xmlns="http://tempuri.org/myOwnSchema.xsd" SuperNumber="1" SuperString="whipcream">
    <Other stuff />
</MyConfiguration> 

Comment pourrais-je lire les attributs XML SuperNumber et SuperString?

Actuellement, j'utilise XmlDocument et j'obtiens les valeurs entre l'utilisation de GetElementsByTagName() de XmlDocument et cela fonctionne vraiment bien. Je n'arrive pas à comprendre comment obtenir les attributs?

75
Alex
XmlNodeList elemList = doc.GetElementsByTagName(...);
for (int i = 0; i < elemList.Count; i++)
{
    string attrVal = elemList[i].Attributes["SuperString"].Value;
}
106
Arsen Mkrtchyan

Vous devriez regarder dans XPath . Une fois que vous aurez commencé à l’utiliser, vous constaterez qu’il est beaucoup plus efficace et plus facile à coder que de parcourir des listes. Il vous permet également d’obtenir directement ce que vous voulez.

Ensuite, le code serait quelque chose de similaire à

string attrVal = doc.SelectSingleNode("/MyConfiguration/@SuperNumber").Value;

Notez que XPath 3.0 est devenu une recommandation du W3C le 8 avril 2014.

87
Greg

Vous pouvez migrer vers XDocument au lieu de XmlDocument, puis utiliser Linq si vous préférez cette syntaxe. Quelque chose comme:

var q = (from myConfig in xDoc.Elements("MyConfiguration")
         select myConfig.Attribute("SuperString").Value)
         .First();
8
Matt Sherman

J'ai un fichier XML books.xml

<ParameterDBConfig>
    <ID Definition="1" />
</ParameterDBConfig>

Programme:

XmlDocument doc = new XmlDocument();
doc.Load("D:/siva/books.xml");
XmlNodeList elemList = doc.GetElementsByTagName("ID");     
for (int i = 0; i < elemList.Count; i++)     
{
    string attrVal = elemList[i].Attributes["Definition"].Value;
}

Maintenant, attrVal a la valeur de ID.

6
siva

XmlDocument.Attributes peut-être? (Qui a une méthode GetNamedItem qui fera probablement ce que vous voulez, même si j'ai toujours juste itéré la collection d'attributs)

5
jerryjvl

Si votre XML contient des espaces de noms, vous pouvez procéder comme suit pour obtenir la valeur d'un attribut:

var xmlDoc = new XmlDocument();

// content is your XML as string
xmlDoc.LoadXml(content);

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable());

// make sure the namespace identifier, URN in this case, matches what you have in your XML 
nsmgr.AddNamespace("ns", "urn:oasis:names:tc:SAML:2.0:protocol");

// get the value of Destination attribute from within the Response node with a prefix who's identifier is "urn:oasis:names:tc:SAML:2.0:protocol" using XPath
var str = xmlDoc.SelectSingleNode("/ns:Response/@Destination", nsmgr);
if (str != null)
{
    Console.WriteLine(str.Value);
}

Plus d'informations sur les espaces de noms XML ici et ici .

1
Voicu

En supposant que votre exemple de document se trouve dans la variable chaîne doc

> XDocument.Parse(doc).Root.Attribute("SuperNumber")
1
1
Colonel Panic