Vorgehensweise: Abrufen des flachen Werts eines Elements
In diesem Thema wird gezeigt, wie Sie den flachen Wert eines Elements abrufen.Der flache Wert ist ausschließlich der Wert des jeweiligen Elements, im Gegensatz zum tiefen Wert, der die Werte aller Nachfolgerelemente enthält, die zu einer einzelnen Zeichenkette verkettet werden.
Beim Abrufen des Elementwerts mithilfe des Umwandlungsverfahrens oder der XElement.Value-Eigenschaft wird der tiefe Wert abgerufen.Um den flachen Wert abzurufen, können Sie die ShallowValue-Erweiterungsmethode verwenden, wie im folgenden Beispiel gezeigt wird.Das Abrufen des flachen Werts ist nützlich, wenn Sie Elemente anhand ihrer Inhalte auswählen möchten.
Im folgenden Beispiel wird eine Erweiterungsmethode deklariert, die den flachen Wert eines Elements abruft.Anschließend wird die Erweiterungsmethode in einer Abfrage verwendet, um alle Elemente aufzulisten, die einen berechneten Wert enthalten.
Beispiel
In diesem Beispiel wird die folgende Textdatei, Report.xml, als Quelldatei verwendet.
<?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
Mit diesem Beispiel wird die folgende Ausgabe erzeugt:
Column Name="CustomerId" =Customer.CustomerId.Heading
Column Name="Name" =Customer.Name.Heading
Column Name="CustomerId" =Customer.CustomerId
Column Name="Name" =Customer.Name