Чтение атрибута XML с использованием XmlDocument - PullRequest
73 голосов
/ 01 июня 2009

Как я могу прочитать атрибут XML, используя C # XmlDocument?

У меня есть XML-файл, который выглядит примерно так:

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

Как бы я прочитал атрибуты XML SuperNumber и SuperString?

В настоящее время я использую XmlDocument, и я получаю значения между ними, используя XmlDocument GetElementsByTagName(), и это работает очень хорошо. Я просто не могу понять, как получить атрибуты?

Ответы [ 7 ]

103 голосов
/ 01 июня 2009
XmlNodeList elemList = doc.GetElementsByTagName(...);
for (int i = 0; i < elemList.Count; i++)
{
    string attrVal = elemList[i].Attributes["SuperString"].Value;
}
87 голосов
/ 01 июня 2009

Вы должны посмотреть на XPath . Как только вы начнете использовать его, вы обнаружите, что его гораздо эффективнее и проще для написания кода, чем для перебора списков. Это также позволяет напрямую получать то, что вы хотите.

Тогда код будет похож на

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

Обратите внимание, что XPath 3.0 стал Рекомендацией W3C 8 апреля 2014 года.

8 голосов
/ 01 июня 2009

Вы можете перейти на XDocument вместо XmlDocument, а затем использовать Linq, если предпочитаете этот синтаксис. Что-то вроде:

var q = (from myConfig in xDoc.Elements("MyConfiguration")
         select myConfig.Attribute("SuperString").Value)
         .First();
6 голосов
/ 05 июня 2012

У меня есть XML-файл books.xml

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

Программа:

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

Теперь attrVal имеет значение ID.

5 голосов
/ 01 июня 2009

XmlDocument.Attributes возможно? (У которого есть метод GetNamedItem, который предположительно будет делать то, что вы хотите, хотя я всегда просто повторял коллекцию атрибутов)

1 голос
/ 01 марта 2016

Если ваш XML содержит пространства имен, вы можете сделать следующее, чтобы получить значение атрибута:

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

Подробнее о пространствах имен XML здесь и здесь .

1 голос
/ 17 марта 2013

Предполагается, что ваш пример документа находится в строковой переменной doc

> XDocument.Parse(doc).Root.Attribute("SuperNumber")
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...