2016-10-19 2 views
2

Следующий код: Building Phone, но не печать uxPhone.
1) Должен ли я получить коллекцию Property потомков, может быть?
2) Это кажется довольно многословным, есть ли более короткая форма этого?Linq to Xml печатает только первое значение потомка

var xmlstr = 
     @"<Form> 
     <ControlsLayout> 
     <Object type='sometype' children='Controls'> 
     <Property name='ControlLabel'>BuildingPhone</Property> 
     <Property name='Name'>uxPhone</Property> 
     </Object> 
     </ControlsLayout> 
     </Form>"; 

XElement xelement = XElement.Parse(xmlstr);  
var controls = xelement.Descendants("Object"); 
foreach (var control in controls) 
{ 
    var xElement = control.Element("Property"); 
    if (xElement != null) 
    { 
     var xAttribute = xElement.Attribute("name"); 
     if (xAttribute != null && xAttribute.Value == "ControlLabel") 
      { Console.WriteLine(xElement.Value); } 
      if (xAttribute != null && xAttribute.Value == "Name") 
      { Console.WriteLine(xElement.Value); } 
    } 
} 
+0

Спасибо Мостафиз и Гилад. Я отмечу, что один из вас ответил, а другой - надпись. Gilad, ваш код не работал для меня из-за функции языка 6.0? Любой шанс, что вы можете переработать его на 4.5 (это максимум, мы можем пойти в prod). Это будет бонус, если вы объясните функцию 6.0. – bkolluru

ответ

1

Должен ли я получить коллекцию потомков собственности, может быть?

Использование функции Element в control.Element("Property") возвращает один элемент. Вместо этого вы хотите использовать Elements.

Это кажется довольно многословным, есть ли более короткая форма этого?

приятнее образом, все вместе использовать Descendants("Property") (который ищет рекурсивно в вашем XML и возвращает коллекцию элементов <> вы указали) и вместо if заявления использовать where пункт:

XElement xelement = XElement.Parse(xmlstr); 
var result = from element in xelement.Descendants("Property") 
      let attribute = element.Attribute("name") 
      where (attribute != null && attribute.Value == "ControlLabel")|| 
        (attribute != null && attribute.Value == "Name") 
      select element.Value; 

foreach(var item in result) 
    Console.WriteLine(item); 

// Building Phone 
// uxPhone 
+0

@bkolluru - Это работало для вас? –

+0

Gilad см. Мой комментарий к OP. – bkolluru

+0

@bkolluru - См. Исправление. BTW - если вы нашли оба ответа полезным, вы можете повысить их. И затем пометить один из них как тот, который решил –

3

Вместо control.Element("Property") которые выбирают одного, используйте control.Elements("Property"), которые выбрать все с Property

XElement xelement = XElement.Parse(xmlstr); 
//var controls = xelement.Descendants("ControlsLayout"); 
var controls = xelement.Descendants("Object"); 
foreach (var control in controls) 
{ 
    var xElement = control.Elements("Property"); // change this line 
    foreach (var element in xElement) 
    { 
     if (element != null) 
     { 
      var xAttribute = element.Attribute("name"); 
      if (xAttribute != null && xAttribute.Value == "ControlLabel") 
      { Console.WriteLine(element.Value); } 
      if (xAttribute != null && xAttribute.Value == "Name") 
      { Console.WriteLine(element.Value); } 
     } 
    } 

} 
Смежные вопросы