Linq到Xml只打印第一个后代值

时间:2016-10-19 15:34:05

标签: c# xml linq linq-to-xml

以下代码正在打印Building Phone但不打印uxPhone
1)我可能会收集Property个后代的集合吗?
2)这看起来相当冗长,是否有更短的形式?

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); }
    }
}

2 个答案:

答案 0 :(得分: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); } } } }

LEFT

答案 1 :(得分: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