Recupero del valore superficiale di un elemento
In questo argomento viene illustrato come ottenere il valore superficiale di un elemento. Per valore superficiale si intende un valore che appartiene solo all'elemento specifico, a differenza del valore completo che include i valori di tutti gli elementi discendenti concatenati in una singola stringa.
Quando si recupera il valore di un elemento eseguendo il cast o usando la proprietà XElement.Value, si ottiene il valore completo. Per recuperare il valore superficiale, è possibile usare il metodo di estensione ShallowValue, come illustrato nell'esempio seguente. Il recupero del valore superficiale risulta utile quando si desidera selezionare gli elementi in base al relativo contenuto.
Nell'esempio seguente viene dichiarato un metodo di estensione che recupera il valore superficiale di un elemento. Questo metodo di estensione viene quindi usato in una query per elencare tutti gli elementi che contengono un valore calcolato.
Esempio
Il file di testo seguente, Report.xml, è l'origine di questo esempio.
<?xml version="1.0" encoding="utf-8" ?>
<Report>
<Section>
<Heading>
<Column Name="CustomerId">=Customer.CustomerId.Heading</Column>
<Column Name="Name">=Customer.Name.Heading</Column>
</Heading>
<Detail>
<Column Name="CustomerId">=Customer.CustomerId</Column>
<Column Name="Name">=Customer.Name</Column>
</Detail>
</Section>
</Report>
public static class MyExtensions
{
public static string ShallowValue(this XElement xe)
{
return xe
.Nodes()
.OfType<XText>()
.Aggregate(new StringBuilder(),
(s, c) => s.Append(c),
s => s.ToString());
}
}
class Program
{
static void Main(string[] args)
{
XElement root = XElement.Load("Report.xml");
IEnumerable<XElement> query = from el in root.Descendants()
where el.ShallowValue().StartsWith("=")
select el;
foreach (var q in query)
{
Console.WriteLine("{0}{1}{2}",
q.Name.ToString().PadRight(8),
q.Attribute("Name").ToString().PadRight(20),
q.ShallowValue());
}
}
}
Module Module1
<System.Runtime.CompilerServices.Extension()> _
Public Function ShallowValue(ByVal xe As XElement)
Return xe _
.Nodes() _
.OfType(Of XText)() _
.Aggregate(New StringBuilder(), _
Function(s, c) s.Append(c), _
Function(s) s.ToString())
End Function
Sub Main()
Dim root As XElement = XElement.Load("Report.xml")
Dim query As IEnumerable(Of XElement) = _
From el In root.Descendants() _
Where (el.ShallowValue().StartsWith("=")) _
Select el
For Each q As XElement In query
Console.WriteLine("{0}{1}{2}", _
q.Name.ToString().PadRight(8), _
q.Attribute("Name").ToString().PadRight(20), _
q.ShallowValue())
Next
End Sub
End Module
Questo esempio produce il seguente output:
Column Name="CustomerId" =Customer.CustomerId.Heading
Column Name="Name" =Customer.Name.Heading
Column Name="CustomerId" =Customer.CustomerId
Column Name="Name" =Customer.Name