Cómo buscar descendientes de un elemento secundario (XPath-LINQ to XML)
Actualización: November 2007
En este tema se muestra cómo obtener los elementos descendientes de un elemento secundario con un nombre particular.
La expresión XPath es:
./Paragraph//Text/text()
Ejemplo
Este ejemplo simula los problemas de extraer texto de una representación XML de un documento de un procesador de texto. Primero selecciona todos los elementos de Paragraph y después selecciona todos los elementos descendientes de Text de cada elemento Paragraph. Esto no selecciona los elementos Text descendientes del elemento Comment.
XElement root = XElement.Parse(
@"<Root>
<Paragraph>
<Text>This is the start of</Text>
</Paragraph>
<Comment>
<Text>This comment is not part of the paragraph text.</Text>
</Comment>
<Paragraph>
<Annotation Emphasis='true'>
<Text> a sentence.</Text>
</Annotation>
</Paragraph>
<Paragraph>
<Text> This is a second sentence.</Text>
</Paragraph>
</Root>");
// LINQ to XML query
string str1 =
root
.Elements("Paragraph")
.Descendants("Text")
.Select(s => s.Value)
.Aggregate(
new StringBuilder(),
(s, i) => s.Append(i),
s => s.ToString()
);
// XPath expression
string str2 =
((IEnumerable)root.XPathEvaluate("./Paragraph//Text/text()"))
.Cast<XText>()
.Select(s => s.Value)
.Aggregate(
new StringBuilder(),
(s, i) => s.Append(i),
s => s.ToString()
);
if (str1 == str2)
Console.WriteLine("Results are identical");
else
Console.WriteLine("Results differ");
Console.WriteLine(str2);
Dim root As XElement = _
<Root>
<Paragraph>
<Text>This is the start of</Text>
</Paragraph>
<Comment>
<Text>This comment is not part of the paragraph text.</Text>
</Comment>
<Paragraph>
<Annotation Emphasis='true'>
<Text> a sentence.</Text>
</Annotation>
</Paragraph>
<Paragraph>
<Text> This is a second sentence.</Text>
</Paragraph>
</Root>
' LINQ to XML query
Dim str1 As String = _
root.<Paragraph>...<Text>.Select(Function(ByVal s) s.Value). _
Aggregate( _
New StringBuilder(), _
Function(ByVal s, ByVal i) s.Append(i), _
Function(ByVal s) s.ToString())
' XPath expression
Dim str2 As String = DirectCast(root.XPathEvaluate("./Paragraph//Text/text()"), IEnumerable) _
.Cast(Of XText)().Select(Function(ByVal s) s.Value) _
.Aggregate( _
New StringBuilder(), _
Function(ByVal s, ByVal i) s.Append(i), _
Function(ByVal s) s.ToString())
If str1 = str2 Then
Console.WriteLine("Results are identical")
Else
Console.WriteLine("Results differ")
End If
Console.WriteLine(str2)
Este ejemplo genera el siguiente resultado:
Results are identical
This is the start of a sentence. This is a second sentence.