Получение значения атрибута XML-документа с помощью C#
Предположим, у меня есть следующий XML-документ.
<reply success="true">More nodes go here</reply>
Как получить значение атрибута success, которое в этом случае будет строкой "true".
6 ответов
Я бы попробовал что-то вроде этого:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<reply success=\"true\">More nodes go here</reply>");
XmlElement root = doc.DocumentElement;
string s = root.Attributes["success"].Value;
если вы загружаете 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 представит вам атрибуты в том же порядке, в котором они появляются в документе; в зависимости от реализации синтаксический анализатор может дать их вам в алфавитном порядке порядке, или в случайном порядке. (Я видел оба.)
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();
}
}
var at =
XElement.Parse("<reply success=\"true\">More nodes go </reply>").Attribute("success");
if (at != null) Console.Write(at.Value);
следующий код работает для меня.
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);
}
вот альтернативное решение с использованием 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);
}