Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Sometimes you want to find all elements that have a specific attribute. You are not concerned about the contents of the attribute. Instead, you want to select based on the existence of the attribute.
The XPath expression is:
./*[@Select]
Example
The following code selects just the elements that have the Select attribute.
XElement doc = XElement.Parse(
@"<Root>
<Child1>1</Child1>
<Child2 Select='true'>2</Child2>
<Child3>3</Child3>
<Child4 Select='true'>4</Child4>
<Child5>5</Child5>
</Root>");
// LINQ to XML query
IEnumerable<XElement> list1 =
from el in doc.Elements()
where el.Attribute("Select") != null
select el;
// XPath expression
IEnumerable<XElement> list2 =
((IEnumerable)doc.XPathEvaluate("./*[@Select]")).Cast<XElement>();
if (list1.Count() == list2.Count() &&
list1.Intersect(list2).Count() == list1.Count())
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
foreach (XElement el in list1)
Console.WriteLine(el);
Dim doc As XElement = _
<Root>
<Child1>1</Child1>
<Child2 Select='true'>2</Child2>
<Child3>3</Child3>
<Child4 Select='true'>4</Child4>
<Child5>5</Child5>
</Root>
' LINQ to XML query
Dim list1 As IEnumerable(Of XElement) = _
From el In doc.Elements() _
Where el.@Select <> Nothing _
Select el
' XPath expression
Dim list2 As IEnumerable(Of XElement) = DirectCast(doc.XPathEvaluate _
("./*[@Select]"), IEnumerable).Cast(Of XElement)()
If list1.Count() = list2.Count() And _
list1.Intersect(list2).Count() = list1.Count() Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
For Each el As XElement In list1
Console.WriteLine(el)
Next
This example produces the following output:
Results are identical
<Child2 Select="true">2</Child2>
<Child4 Select="true">4</Child4>