2015-11-12 3 views
1

В настоящее время я переписываю XmlDocument и XmlElements в XDocument и XElement. Я столкнулся с небольшой проблемой, я использовал просто один узел ModuleRequests, а не через него. Я думал, что простое право я просто переписать так:Запуск элемента XDocument и получение определенных атрибутов

var propertiesRequested = new XmlDocument(); 
propertiesRequested.LoadXml(propertiesConfiguration); 
var requests = propertiesRequested.SelectSingleNode("ModuleRequests"); 
foreach (XmlNode request in requests) 
{ 
    var propertyValue = request.Attributes["Id"].Value; 

    if (systemProperties.ContainsKey(propertyValue) == false) 
    { 
     systemProperties.Add(propertyValue, request.Attributes["Request"].Value); 
    } 
} 

Для этого:

var propertiesRequested = XDocument.Parse(propertiesConfiguration); 
var requests = propertiesRequested.Element("ModuleRequests"); 

foreach (XNode request in requests) 
{ 
    var propertyValue = request.Attributes["Id"].Value; 

    if (systemProperties.ContainsKey(propertyValue) == false) 
    { 
     systemProperties.Add(propertyValue, request.Attributes["Request"].Value); 
    } 
} 

Ну, разумеется, это не так легко, то я думал, что штраф я сделаю это:

foreach(XNode request in requests.Nodes()) 

но это дало мне еще больше проблем, поскольку XNode не имеет атрибута.

Как вы, вероятно, можете сказать, что я немного новичок, когда дело доходит до чтения xml. Я надеюсь, что кто-то сможет мне помочь. Что такое правильный способ переписать из XmlDocument в XDocument

ответ

1

Вы хотите использовать XElement.Elements() для перебора всех дочерних элементов вашего requests элемента, а затем использовать XElement.Attribute(XName name) принести указанный атрибут по имени.

Вы могли бы также рассмотреть вопрос оexplicitly casting your XAttribute to a string, а не использовать Value свойство, как бывший вернется null на недостающий атрибут, а не генерировать нулевой ссылочный исключение.

Таким образом:

var propertiesRequested = XDocument.Parse(propertiesConfiguration); 
var requests = propertiesRequested.Element("ModuleRequests"); 
foreach (var request in requests.Elements()) 
{ 
    var propertyValue = (string)request.Attribute("Id"); 

    if (systemProperties.ContainsKey(propertyValue) == false) 
    { 
     systemProperties.Add(propertyValue, (string)request.Attribute("Request")); 
    } 
} 
Смежные вопросы