Как прочитать значение атрибута из XmlNode в C#?
Предположим, у меня есть XmlNode и я хочу получить значение атрибута с именем "Name".
Как я могу это сделать?
XmlTextReader reader = new XmlTextReader(path);
XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);
foreach (XmlNode chldNode in node.ChildNodes)
{
**//Read the attribute Name**
if (chldNode.Name == Employee)
{
if (chldNode.HasChildNodes)
{
foreach (XmlNode item in node.ChildNodes)
{
}
}
}
}
XML-документа:
<Root>
<Employee Name ="TestName">
<Childs/>
</Root>
8 ответов:
чтобы расширить решение Konamiman (включая все соответствующие нулевые проверки), это то, что я делал:
if (node.Attributes != null) { var nameAttribute = node.Attributes["Name"]; if (nameAttribute != null) return nameAttribute.Value; throw new InvalidOperationException("Node 'Name' not found."); }
вы можете перебрать все атрибуты, как вы делаете с узлами
foreach (XmlNode item in node.ChildNodes) { // node stuff... foreach (XmlAttribute att in item.Attributes) { // attribute stuff } }
если все, что вам нужно, это имена, используйте xpath вместо этого. Не нужно делать итерацию самостоятельно и проверять на null.
string xml = @" <root> <Employee name=""an"" /> <Employee name=""nobyd"" /> <Employee/> </root> "; var doc = new XmlDocument(); //doc.Load(path); doc.LoadXml(xml); var names = doc.SelectNodes("//Employee/@name");
если вы используете
chldNodeкакXmlElementвместоXmlNode, вы можете использоватьvar attributeValue = chldNode.GetAttribute("Name");The возвращаемое значение будет пустой строкой, если имя атрибута не существует.
так что ваш цикл может выглядеть так:
XmlDocument document = new XmlDocument(); var nodes = document.SelectNodes("//Node/N0de/node"); foreach (XmlElement node in nodes) { var attributeValue = node.GetAttribute("Name"); }при этом будут выбраны все узлы
<node>в окружении<Node><N0de></N0de><Node>теги и затем цикл через них и прочитать атрибут "имя".
еще одно решение:
string s = "??"; // or whatever if (chldNode.Attributes.Cast<XmlAttribute>() .Select(x => x.Value) .Contains(attributeName)) s = xe.Attributes[attributeName].Value;Это также позволяет избежать исключения, когда ожидаемый атрибут
attributeNameна самом деле не существует.
Comments