Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se muestra cómo usar XPathSelectElements para buscar elementos en función de su posición, por ejemplo, buscar el segundo elemento o del tercero al quinto. También se muestran dos maneras de usar una consulta LINQ to XML para hacer lo mismo.
Existen dos enfoques para escribir esta consulta LINQ to XML de forma diferida. Puede utilizar los operadores Skip y Take, o bien utilizar la sobrecarga Where que recibe un índice. Si utiliza la sobrecarga Where, estará utilizando una expresión lambda que recibe dos argumentos. El siguiente ejemplo muestra ambos métodos para seleccionar elementos en base a la posición.
Ejemplo: Búsqueda del segundo al cuarto elemento Test
En este ejemplo se busca del segundo hasta el cuarto elemento Test de Archivo XML de ejemplo: configuración de prueba. El resultado es una colección de elementos.
La expresión XPath es Test[position() >= 2 and position() <= 4].
XElement testCfg = XElement.Load("TestConfig.xml");
// LINQ to XML query
IEnumerable<XElement> list1 =
testCfg
.Elements("Test")
.Skip(1)
.Take(3);
// LINQ to XML query
IEnumerable<XElement> list2 =
testCfg
.Elements("Test")
.Where((el, idx) => idx >= 1 && idx <= 3);
// XPath expression
IEnumerable<XElement> list3 =
testCfg.XPathSelectElements("Test[position() >= 2 and position() <= 4]");
if (list1.Count() == list2.Count() &&
list1.Count() == list3.Count() &&
list1.Intersect(list2).Count() == list1.Count() &&
list1.Intersect(list3).Count() == list1.Count())
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
foreach (XElement el in list1)
Console.WriteLine(el);
Dim testCfg As XElement = XElement.Load("TestConfig.xml")
' LINQ to XML query
Dim list1 As IEnumerable(Of XElement) = _
testCfg.Elements("Test").Skip(1).Take(3)
'LINQ to XML query
Dim list2 As IEnumerable(Of XElement) = _
testCfg.Elements("Test"). _
Where(Function(ByVal el, ByVal idx) idx >= 1 And idx <= 3)
' XPath expression
Dim list3 As IEnumerable(Of XElement) = _
testCfg.XPathSelectElements("Test[position() >= 2 and position() <= 4]")
If list1.Count() = list2.Count() And _
list1.Count() = list3.Count() And _
list1.Intersect(list2).Count() = list1.Count() And _
list1.Intersect(list3).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
Este ejemplo produce el siguiente resultado:
Results are identical
<Test TestId="0002" TestType="CMD">
<Name>Find succeeding characters</Name>
<CommandLine>Examp2.EXE</CommandLine>
<Input>abc</Input>
<Output>def</Output>
</Test>
<Test TestId="0003" TestType="GUI">
<Name>Convert multiple numbers to strings</Name>
<CommandLine>Examp2.EXE /Verbose</CommandLine>
<Input>123</Input>
<Output>One Two Three</Output>
</Test>
<Test TestId="0004" TestType="GUI">
<Name>Find correlated key</Name>
<CommandLine>Examp3.EXE</CommandLine>
<Input>a1</Input>
<Output>b1</Output>
</Test>