2014-01-22 2 views
2

Я пытаюсь выбрать значения из двух соседних узлов XML в то же время с помощьюВыберите несколько значений Xml документа в одном заявлении

var values = 
      xDoc.Element("root") 
       .Elements("model") 
       .Where(x => x.Element("modelName").Value == modelType.ToString()) 
       .Elements("directory") 
       .Select(x => new { x.Element("directoryName").Value, 
           x.Element("taskName").Value }); 

Я получаю красные загогулины под на .Value с, говоря «Дублировать анонимный тип имя свойства 'Значение'. Вот XML

<root> 
    <model> 
    <modelName>Model1</modelName> 
    <directory> 
     <directoryName>Dir1</directoryName> 
     <taskName>Task1</taskName> 
    </directory> 
    </model> 
    <model> 
    <modelName>Model2</modelName> 
    <directory> 
     <directoryName>FirstValue</directoryName> 
     <taskName>SecondValue</taskName> 
    </directory> 
    </model> 
</root> 

Я хочу, чтобы извлечь Dir1 и tASK1 или FirstValue и SecondValue.

ответ

3

Я предлагаю вам использовать литейные элементы в строку вместо того, чтобы доступ к их Value собственности. Потому что, если элемент отсутствует (например, для Model1 у вас нет элемента taskName), вы получите NullReferenceException.

var values = from m in xDoc.Root.Elements("model") 
      where (string)m.Element("modelName") == modelType.ToString() 
      let d = m.Element("directory") 
      select new { 
       Directory = (string)d.Element("directoryName"), 
       Task = (string)d.Element("taskName") 
      }; 

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

string xpath = String.Format("root/model[modelName='{0}']/directory", modelType); 
var values = from d in xdoc.XPathSelectElements(xpath) 
      select new { 
       Directory = (string)d.Element("directoryName"), 
       Task = (string)d.Element("taskName") 
      }; 
+0

У меня есть схема для проверки XML, спасибо. – reggaeguitar

+0

@reggaeguitar Ваш код генерирует исключение для образца xml, который вы предоставили. Попробуйте это с помощью 'modelType =" Model1 "' –

+0

Это метод, в котором вы должны указать перечисление для типа модели, например ModelType.Model2, которое превратится в строку «Model2» на вызов ToString(). Я просто заполнил xml. – reggaeguitar

2

Фигурные это, вам просто нужно назвать свойства в анонимного типа

var values = 
      xDoc.Element("root") 
       .Elements("model") 
       .Where(x => x.Element("modelName").Value == modelType.ToString()) 
       .Elements("directory") 
       .Select(x => new { Directory = x.Element("directoryName").Value, 
            Task = x.Element("taskName").Value }); 
Смежные вопросы