Leer el atributo XML con XmlDocument

79

¿Cómo puedo leer un atributo XML usando XmlDocument de C #?

Tengo un archivo XML que se parece a esto:

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

¿Cómo leería los atributos XML SuperNumber y SuperString?

Actualmente estoy usando XmlDocument, y obtengo los valores entre el uso de XmlDocument GetElementsByTagName()y eso funciona muy bien. ¿Simplemente no puedo averiguar cómo obtener los atributos?

Alex
fuente

Respuestas:

114
XmlNodeList elemList = doc.GetElementsByTagName(...);
for (int i = 0; i < elemList.Count; i++)
{
    string attrVal = elemList[i].Attributes["SuperString"].Value;
}
Arsen Mkrtchyan
fuente
Muchas gracias. realmente funciona y no necesita caminos ni nada. simplemente excelente !!
Nani
88

Debería buscar en XPath . Una vez que comience a usarlo, encontrará que es mucho más eficiente y más fácil de codificar que iterar por listas. También le permite obtener directamente las cosas que desea.

Entonces el código sería algo similar a

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

Tenga en cuenta que XPath 3.0 se convirtió en una recomendación del W3C el 8 de abril de 2014.

Greg
fuente
8

Puede migrar a XDocument en lugar de XmlDocument y luego usar Linq si prefiere esa sintaxis. Algo como:

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

Tengo un archivo Xml books.xml

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

Programa:

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;
}

Ahora attrValtiene el valor de ID.

Siva
fuente
5

XmlDocument.Attributes¿quizás? (Que tiene un método GetNamedItem que presumiblemente hará lo que quieras, aunque siempre he iterado la colección de atributos)

jerryjvl
fuente
1

Suponiendo que su documento de ejemplo está en la variable de cadena doc

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

Si su XML contiene espacios de nombres, puede hacer lo siguiente para obtener el valor de un atributo:

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);
}

Más sobre espacios de nombres XML aquí y aquí .

Voicu
fuente