Получить читатель из Xnode не работает - PullRequest
1 голос
/ 11 декабря 2011

Я пытался получить атрибуты из XNode, я использую следующий код

        XDocument document = XDocument.Load(FilePath);

        var Elements = from p in document.Descendants(modality) select p.Elements("Key_Part");

        //var Attriputess = from p in document.Descendants(modality) select p.Attributes();    
        foreach (var Element in Elements)
        {

            foreach (var node in Element.Nodes())
            {

                XmlReader reader = node.CreateReader();



                string a = reader.GetAttribute("Type"); 


            }



        }

всегда равно нулю тип XML такой:

<ShortcutList Version="8">
  <Doctor>
    <Key_Part >
        <Key1 Name = "XX" Type= "XXXXXXXXX" > rrrr</Key1>
        <Key2 Name = "XasfsaX" Type= "XXXXsafasfXXXXX" > rrsfsfrr</Key1>
    </Key_Part>

Я хочу получить атрибуты Key1, Key2 и значение

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Я должен сказать, что я исправил XML, который вы предоставили, прежде чем получил рабочий запрос ниже.Таким образом, вы не закрыли два последних тега и закрыли тег Key2 на </Key1>, что является неправильным XML.

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

var keys = xdoc.Descendants("ShortcutList")
               .Descendants("Doctor")
               .Descendants("Key_Part")
               .DescendantNodes()
               .OfType<XElement>()
               .Where(d => d.Name.LocalName.Contains("Key"))
               .Select(e => new {
                                 Value = e.Value, 
                                 Name = e.Attribute("Name").Value, 
                                 Type = e.Attribute("Type").Value
                                })
              .ToList();

РЕДАКТИРОВАТЬ: Fixed XML

<ShortcutList Version="8">
  <Doctor>
    <Key_Part >
        <Key1 Name = "XX" Type= "XXXXXXXXX" > rrrr</Key1>
        <Key2 Name = "XasfsaX" Type= "XXXXsafasfXXXXX" > rrsfsfrr</Key2>
    </Key_Part>
</Doctor>
</ShortcutList>
0 голосов
/ 11 декабря 2011

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

Отредактировано для добавления запрошенного примера:

foreach (var a in document.Descendants(modality).Elements("Key_Part").Select(e => e.Attribute("Type").Value)) {
    // the variable a is a string with the attribute value
}

Или вот так:

foreach (var attr in document.Descendants(modality).Elements("Key_Part").Attributes("Type")) {
    string a = attr.Value;
}
...