Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Möglichkeit zum Verbessern der Leistung in LINQ to XML ist, XName-Objekte vorab zu atomisieren. Voratomisierung bedeutet, dass einem XName-Objekt eine Zeichenfolge zugeordnet wird, bevor Sie mithilfe der Konstruktoren der XElement-Klasse und der XAttribute-Klasse die XML-Struktur erstellen. Anschließend wird anstelle der Übergabe einer Zeichenfolge an den Konstruktor, der die implizite Konvertierung von Zeichenfolge in XName verwenden würde, das initialisierte XName-Objekt übergeben.
Dies verbessert die Leistung beim Erstellen von großen XML-Strukturen, in denen Namen wiederholt werden. Deklarieren und initialisieren Sie hierzu XName-Objekte, bevor Sie die XML-Struktur erstellen, und verwenden Sie dann die XName-Objekte, anstatt für die Element- und Attributnamen Zeichenfolgen anzugeben. Mit dieser Vorgehensweise können beim Erstellen einer großen Anzahl von Elementen oder Attributen wesentliche Leistungsverbesserungen erzielt werden.
Sie sollten Voratomisierung innerhalb Ihres Szenarios testen, um eine Entscheidung über die Anwendbarkeit dieses Verfahrens zu treffen.
Beispiel: Erstellen von Elementen auf verschiedene Weise, mit und ohne Voratomisierung
Im folgenden Beispiel wird die Voratomisierung veranschaulicht.
XName Root = "Root";
XName Data = "Data";
XName ID = "ID";
XElement root = new XElement(Root,
new XElement(Data,
new XAttribute(ID, "1"),
"4,100,000"),
new XElement(Data,
new XAttribute(ID, "2"),
"3,700,000"),
new XElement(Data,
new XAttribute(ID, "3"),
"1,150,000")
);
Console.WriteLine(root);
Dim root1 As XName = "Root"
Dim data As XName = "Data"
Dim id As XName = "ID"
Dim root2 As New XElement(root1, New XElement(data, New XAttribute(id, "1"), "4,100,000"),
New XElement(data, New XAttribute(id, "2"), "3,700,000"),
New XElement(data, New XAttribute(id, "3"), "1,150,000"))
Console.WriteLine(root2)
Dieses Beispiel erzeugt die folgende Ausgabe:
<Root>
<Data ID="1">4,100,000</Data>
<Data ID="2">3,700,000</Data>
<Data ID="3">1,150,000</Data>
</Root>
Im folgenden Beispiel wird dieselbe Vorgehensweise für ein XML-Dokument in einem Namespace erläutert:
XNamespace aw = "http://www.adventure-works.com";
XName Root = aw + "Root";
XName Data = aw + "Data";
XName ID = "ID";
XElement root = new XElement(Root,
new XAttribute(XNamespace.Xmlns + "aw", aw),
new XElement(Data,
new XAttribute(ID, "1"),
"4,100,000"),
new XElement(Data,
new XAttribute(ID, "2"),
"3,700,000"),
new XElement(Data,
new XAttribute(ID, "3"),
"1,150,000")
);
Console.WriteLine(root);
Dim aw As XNamespace = "http://www.adventure-works.com"
Dim root1 As XName = aw + "Root"
Dim data As XName = aw + "Data"
Dim id As XName = "ID"
Dim root2 As New XElement(root1, New XAttribute(XNamespace.Xmlns + "aw", aw),
New XElement(data, New XAttribute(id, "1"), "4,100,000"),
New XElement(data, New XAttribute(id, "2"), "3,700,000"),
New XElement(data, New XAttribute(id, "3"), "1,150,000"))
Console.WriteLine(root2)
Dieses Beispiel erzeugt die folgende Ausgabe:
<aw:Root xmlns:aw="http://www.adventure-works.com">
<aw:Data ID="1">4,100,000</aw:Data>
<aw:Data ID="2">3,700,000</aw:Data>
<aw:Data ID="3">1,150,000</aw:Data>
</aw:Root>
Das folgende Beispiel entspricht eher realen Bedingungen. In diesem Beispiel wird der Inhalt des Elements durch eine Abfrage bereitgestellt:
XName Root = "Root";
XName Data = "Data";
XName ID = "ID";
DateTime t1 = DateTime.Now;
XElement root = new XElement(Root,
from i in System.Linq.Enumerable.Range(1, 100000)
select new XElement(Data,
new XAttribute(ID, i),
i * 5)
);
DateTime t2 = DateTime.Now;
Console.WriteLine("Time to construct:{0}", t2 - t1);
Dim root1 As XName = "Root"
Dim data As XName = "Data"
Dim id As XName = "ID"
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim root2 As New XElement(root1, From i In Enumerable.Range(1, 100000)
Select New XElement(data, New XAttribute(ID, i), i * 5))
sw.Stop()
Console.WriteLine($"Time to construct: {sw.ElapsedMilliseconds} milliseconds")
Im vorherigen Beispiel wird eine bessere Leistung als im folgenden Beispiel erzielt, in dem Namen nicht voratomisiert werden:
DateTime t1 = DateTime.Now;
XElement root = new XElement("Root",
from i in System.Linq.Enumerable.Range(1, 100000)
select new XElement("Data",
new XAttribute("ID", i),
i * 5)
);
DateTime t2 = DateTime.Now;
Console.WriteLine("Time to construct:{0}", t2 - t1);
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim root As New XElement("Root", From i In Enumerable.Range(1, 100000)
Select New XElement("Data", New XAttribute("ID", i), i * 5))
sw.Stop()
Console.WriteLine($"Time to construct: {sw.ElapsedMilliseconds} milliseconds")