Odczytaj atrybut XML przy użyciu XmlDocument

80

Jak odczytać atrybut XML przy użyciu XmlDocument w języku C #?

Mam plik XML, który wygląda mniej więcej tak:

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

Jak odczytać atrybuty XML SuperNumber i SuperString?

Obecnie używam XmlDocument i uzyskuję wartości pomiędzy używaniem XmlDocument, GetElementsByTagName()a to działa naprawdę dobrze. Po prostu nie mogę dowiedzieć się, jak uzyskać atrybuty?

Alex
źródło

Odpowiedzi:

115
XmlNodeList elemList = doc.GetElementsByTagName(...);
for (int i = 0; i < elemList.Count; i++)
{
    string attrVal = elemList[i].Attributes["SuperString"].Value;
}
Arsen Mkrtchyan
źródło
Dziękuję bardzo. to naprawdę działa i nie potrzebuje żadnych ścieżek ani niczego. po prostu wspaniały!
Nani,
88

Powinieneś zajrzeć do XPath . Gdy zaczniesz go używać, przekonasz się, że jest on dużo bardziej wydajny i łatwiejszy do kodowania niż iterowanie po listach. Pozwala także bezpośrednio uzyskać to, czego chcesz.

Wtedy kod byłby podobny do

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

Zauważ, że XPath 3.0 stał się rekomendacją W3C 8 kwietnia 2014.

Greg
źródło
8

Możesz przeprowadzić migrację do XDocument zamiast XmlDocument, a następnie użyć Linq, jeśli wolisz tę składnię. Coś jak:

var q = (from myConfig in xDoc.Elements("MyConfiguration")
         select myConfig.Attribute("SuperString").Value)
         .First();
Matt Sherman
źródło
8

Mam plik XML books.xml

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

Program:

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

Teraz attrValma wartość ID.

śiwa
źródło
5

XmlDocument.Attributesbyć może? (Który ma metodę GetNamedItem, która prawdopodobnie zrobi to, co chcesz, chociaż zawsze powtarzałem kolekcję atrybutów)

jerryjvl
źródło
1

Zakładając, że przykładowy dokument znajduje się w zmiennej łańcuchowej doc

> XDocument.Parse(doc).Root.Attribute("SuperNumber")
1
Colonel Panic
źródło
1

Jeśli Twój kod XML zawiera przestrzenie nazw, możesz wykonać następujące czynności, aby uzyskać wartość atrybutu:

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

Więcej o przestrzeniach nazw XML tutaj i tutaj .

Voicu
źródło