Как получить значения атрибутов из вложенного узла xml? - PullRequest
1 голос
/ 27 декабря 2010

У меня объект XElement отформатирован так:

<Setting guid="3bcedf55-b75f-456b-b90a-a92cbbb022ga">
    <PatientFieldList>
        <PatientFieldSetting PatientName="UserDecision" PatentFieldLength="64" />
        <PatientFieldSetting PatientName="prohibited" PatentFieldLength="128" />
    </PatientFieldList>
</Setting>

Мне нужно получить значения всех атрибутов во всех узлах, но я не знаю, как: / я пытался

xml.Elements("PatientFieldList")

xml.Descendants("PatientsSettingsFieldsList").Where(x => x.Attribute("PatentFieldLength").Value == 64)`

У меня много таких узлов, поэтому мне интересно, есть ли простой способ доступа к этим атрибутам с помощью '[]' или как-то еще.

Ответы [ 2 ]

4 голосов
/ 27 декабря 2010

Код:

using System;
using System.Linq;
using System.Xml.Linq

var xml = "<Setting ...";
var doc = XElement.Parse(xml);
int i; // for int parse
var q = from node in doc.Descendants("PatientFieldSetting")
        let name = node.Attribute("PatientName")
        let length = node.Attribute("PatentFieldLength")
        select new { Name = (name != null) ? name.Value : "", Length = (length != null && Int32.TryParse(length.Value, out i)) ? i : 0 };

foreach (var node in q)
{
    Console.WriteLine("Name={0}, Length={1}", node.Name, node.Length);
}

Выход:

Name=UserDecision, Length=64
Name=prohibited, Length=128
1 голос
/ 27 декабря 2010

Это распечатает атрибуты всех узлов, которые имеют атрибуты в вашем XML:

XDocument doc = //your data

var q = from node in doc.Descendants()
        where node.Attributes().Count() > 0
        select new {NodeName = node.Name, Attributes = node.Attributes()};

foreach (var node in q)
{
    Console.WriteLine( node.NodeName );
    foreach (var attribute in node.Attributes)
    {
        Console.WriteLine(attribute.Name + ":" + attribute.Value);
    }
    Console.WriteLine();
}

Если вам нужен только фильтр узлов PatientFieldSetting для имени:

from node in doc.Descendants("PatientFieldSetting")
...