Получение значения атрибута XML-документа с использованием C # - PullRequest
10 голосов
/ 20 сентября 2010

Предположим, у меня есть следующий XML-документ.

<reply success="true">More nodes go here</reply>

Как получить значение атрибута success, которым в этом случае будет строка "true".

Ответы [ 6 ]

25 голосов
/ 20 сентября 2010

Я бы попробовал что-то вроде этого:

XmlDocument doc = new XmlDocument();
doc.LoadXml("<reply success=\"true\">More nodes go here</reply>");

XmlElement root = doc.DocumentElement;

string s = root.Attributes["success"].Value;
9 голосов
/ 22 сентября 2010

Если вы загружаете XML в XmlDocument, существует множество способов получить значение атрибута. Вы можете использовать XPath, чтобы найти атрибут:

XmlAttribute a = doc.SelectSingleNode("/reply/@success");
Console.Write(a.Value);

Если у вас уже есть XmlElement, к которому относится атрибут (который в данном случае является элементом документа), тогда вы можете просто использовать GetAttribute:

Console.Write(doc.DocumentElement.GetAttribute("success"));

Существуют аналогичные подходы, если вы используете XPathDocument или XmlReader или XDocument.

Однако во всех случаях вы хотите получить атрибут по его имени , а не по его позиции. В вашем тестовом примере есть только один атрибут; в любом реальном приложении вероятно наличие нескольких атрибутов, а порядок следования атрибутов в XML не имеет значения. Эти два элемента семантически эквивалентны:

<a foo='true' bar='false'/>

<a bar='false' foo='true'/>

Вы даже не знаете, что синтаксический анализатор XML будет представлять вам атрибуты в том же порядке, в котором они появляются в документе; в зависимости от реализации, парсер может выдавать их вам в алфавитном порядке или в случайном порядке. (Я видел оба.)

2 голосов
/ 20 сентября 2010
    using System;
    using System.Linq;
    using System.Xml.Linq;

    class MyClass
    {
        static void Main(string[] args)
        {
            XElement xmlcode =
            XElement.Parse("<reply success=\"true\">More nodes go  </reply>");

            var successAttributes =
                from attribute in xmlcode.Attributes()
                where attribute.Name.LocalName=="success" 
                select attribute ;

            if(successAttributes.Count()>0)
            foreach (var sa in successAttributes)
            {
                Console.WriteLine(sa.Value);           
            }
            Console.ReadLine();
        }
    }
1 голос
/ 28 сентября 2010
var at = 
XElement.Parse("<reply success=\"true\">More nodes go  </reply>").Attribute("success");
if (at != null) Console.Write(at.Value);
0 голосов
/ 23 сентября 2013

У меня работает следующий код.

String strXML = "<reply success=\"true\">More nodes go here</reply>";

    using (XmlReader reader = XmlReader.Create(new StringReader(strXML)))
    {
            reader.ReadToFollowing("reply");
            reader.MoveToContent();
            string strValue = reader.GetAttribute("success");
            Console.WriteLine(strValue);
    }
0 голосов
/ 20 сентября 2010

Вот альтернативное решение, использующее XmlReader, которое может быть немного более эффективным, чем использование XmlDoument, хотя это возможно незначительно в таком небольшом XML-документе

string input = "<reply success=\"true\">More nodes go here</reply>";

using (XmlReader xmlReader = XmlReader.Create(new StringReader(input)))
{
    xmlReader.MoveToContent();
    string success = xmlReader.GetAttribute("success");
    Console.WriteLine(success);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...