Änderung der XML-Struktur im Arbeitsspeicher und Funktionale Konstruktion (LINQ to XML) (C#)In-Memory XML Tree Modification vs. Functional Construction (LINQ to XML) (C#)

Zur Änderung der Form eines XML-Dokuments wird üblicherweise die XML-Struktur an Ort und Stelle geändert.Modifying an XML tree in place is a traditional approach to changing the shape of an XML document. Eine typische Anwendung lädt ein Dokument in einen Datenspeicher, z. B. DOM oder LINQ to XML, verwendet eine Programmierschnittstelle, um Knoten einzufügen, zu löschen oder zu ändern, und speichert den XML-Code dann in einer Datei bzw. überträgt ihn über ein Netzwerk.A typical application loads a document into a data store such as DOM or LINQ to XML; uses a programming interface to insert nodes, delete nodes, or change the content of nodes; and then saves the XML to a file or transmits it over a network.

LINQ to XML ermöglicht eine andere Herangehensweise, die sich in vielen Szenarios als hilfreich erweist: die funktionale Konstruktion. enables another approach that is useful in many scenarios: functional construction. Bei der funktionalen Konstruktion wird das Ändern von Daten als ein Transformationsproblem und nicht als detaillierte Manipulation eines Datenspeichers angesehen.Functional construction treats modifying data as a problem of transformation, rather than as detailed manipulation of a data store. Wenn Sie eine Datendarstellung effizient von einer Form in eine andere Form transformieren können, sieht das Ergebnis genauso aus, als hätten Sie einen Datenspeicher so manipuliert, dass er eine andere Form erhalten hat.If you can take a representation of data and transform it efficiently from one form to another, the result is the same as if you took one data store and manipulated it in some way to take another shape. Ein entscheidender Punkt bei der funktionalen Konstruktion ist die Übergabe der Ergebnisse von Abfragen an die Konstruktoren XDocument und XElement.A key to the functional construction approach is to pass the results of queries to XDocument and XElement constructors.

Das Schreiben des Transformationscodes kostet Sie häufig nur einen Bruchteil der Zeit, die Sie für die Manipulation des Datenspeichers hätten aufwenden müssen, und der Code ist robuster und leichter zu unterhalten.In many cases you can write the transformational code in a fraction of the time that it would take to manipulate the data store, and that code is more robust and easier to maintain. In diesen Fällen ist die Verwendung von Transformationscode die effektivere Möglichkeit, Daten zu ändern, auch wenn die Transformation mehr CPU-Leistung beansprucht.In these cases, even though the transformational approach can take more processing power, it is a more effective way to modify data. Wenn ein Entwickler mit dem funktionalen Ansatz vertraut ist, ist der entstehende Code häufig einfacher zu verstehen.If a developer is familiar with the functional approach, the resulting code in many cases is easier to understand. Es ist dann auch leichter, den Code zu finden, der die einzelnen Teile der Struktur ändert.It is easy to find the code that modifies each part of the tree.

Das Ändern einer XML-Struktur an Ort und Stelle ist vielen DOM-Programmierern vertrauter, während Code, der mit dem funktionalen Ansatz geschrieben wurde, für Entwickler, die diesen Ansatz nicht kennen, eher fremd aussieht.The approach where you modify an XML tree in-place is more familiar to many DOM programmers, whereas code written using the functional approach might look unfamiliar to a developer who doesn't yet understand that approach. Wenn an einer großen XML-Struktur nur eine kleine Änderung vorgenommen werden muss, wird die CPU durch das Ändern der Struktur an Ort und Stelle weniger beansprucht.If you have to only make a small modification to a large XML tree, the approach where you modify a tree in place in many cases will take less CPU time.

Dieses Thema enthält ein Beispiel, das mit beiden Ansätzen implementiert wird.This topic provides an example that is implemented with both approaches.

Transformieren von Attributen in ElementeTransforming Attributes into Elements

Nehmen wir für dieses Beispiel an, Sie möchten das folgende einfache XML-Dokument so ändern, dass aus den Attributen Elemente werden.For this example, suppose you want to modify the following simple XML document so that the attributes become elements. Zunächst wird in diesem Thema der herkömmliche Ansatz gezeigt: das Ändern einer Struktur an Ort und Stelle.This topic first presents the traditional in-place modification approach. Anschließend wird der Ansatz der funktionalen Konstruktion dargestellt.It then shows the functional construction approach.

<?xml version="1.0" encoding="utf-8" ?>  
<Root Data1="123" Data2="456">  
  <Child1>Content</Child1>  
</Root>  

Ändern der XML-StrukturModifying the XML Tree

Sie können prozeduralen Code zum Erstellen von Elementen aus Attributen schreiben und dann die Attribute löschen. Dies sieht wie folgt aus:You can write some procedural code to create elements from the attributes, and then delete the attributes, as follows:

XElement root = XElement.Load("Data.xml");  
foreach (XAttribute att in root.Attributes()) {  
    root.Add(new XElement(att.Name, (string)att));  
}  
root.Attributes().Remove();  
Console.WriteLine(root);  

Dieser Code erzeugt die folgende Ausgabe:This code produces the following output:

<Root>  
  <Child1>Content</Child1>  
  <Data1>123</Data1>  
  <Data2>456</Data2>  
</Root>  

Funktionale KonstruktionFunctional Construction Approach

Bei der funktionalen Konstruktion wird zunächst eine neue Struktur erstellt. Dann werden Elemente und Attribute aus der Quellstruktur ausgewählt und der neuen Struktur hinzugefügt, wobei sie entsprechend transformiert werden.By contrast, a functional approach consists of code to form a new tree, picking and choosing elements and attributes from the source tree, and transforming them as appropriate as they are added to the new tree. Der funktionale Ansatz sieht wie folgt aus:The functional approach looks like the following:

XElement root = XElement.Load("Data.xml");  
XElement newTree = new XElement("Root",  
    root.Element("Child1"),  
    from att in root.Attributes()  
    select new XElement(att.Name, (string)att)  
);  
Console.WriteLine(newTree);  

Dieses Beispiel gibt denselben XML-Code wie das erste Beispiel aus.This example outputs the same XML as the first example. Beachten Sie dabei aber, dass Sie beim funktionalen Ansatz die entstehende Struktur des neuen XML-Codes auch tatsächlich sehen können.However, notice that you can actually see the resulting structure of the new XML in the functional approach. Sie können die Erstellung des Root-Elements, den Code, der das Child1-Element aus der ursprünglichen Struktur abruft, und den Code sehen, der die Attribute aus der Quellstruktur in Elemente in der neuen Struktur transformiert.You can see the creation of the Root element, the code that pulls the Child1 element from the source tree, and the code that transforms the attributes from the source tree to elements in the new tree.

Der funktionale Ansatz ist in diesem Beispiel nicht kürzer und auch in keiner Weise einfacher als das erste Beispiel.The functional example in this case is not any shorter than the first example, and it is not really any simpler. Wenn an einer XML-Struktur aber viele Änderungen vorgenommen werden müssen, wird der nicht-funktionale Ansatz ziemlich komplex und in gewisser Weise stumpf.However, if you have many changes to make to an XML tree, the non functional approach will become quite complex and somewhat obtuse. Im Unterschied dazu erstellen Sie beim funktionalen Ansatz lediglich den gewünschten XML-Code mit entsprechenden eingebetteten Abfragen und Ausdrücken, sodass Sie den gewünschten Inhalt erhalten.In contrast, when using the functional approach, you still just form the desired XML, embedding queries and expressions as appropriate, to pull in the desired content. Der funktionale Ansatz erzeugt Code, der leichter zu unterhalten ist.The functional approach yields code that is easier to maintain.

Beachten Sie, dass der funktionale Ansatz in diesem Fall wahrscheinlich nicht so gut funktioniert wie die direkte Bearbeitung der Struktur.Notice that in this case the functional approach probably would not perform quite as well as the tree manipulation approach. Das Hauptproblem dabei ist, dass beim funktionalen Ansatz kurzlebigere Objekte entstehen.The main issue is that the functional approach creates more short lived objects. Der funktionale Ansatz zahlt sich aber aus, wenn der Programmierer dadurch produktiver wird.However, the tradeoff is an effective one if using the functional approach allows for greater programmer productivity.

Das hier verwendete Beispiel ist ein sehr einfaches Beispiel, das lediglich dazu dient, die grundlegenden Unterschiede zwischen den beiden Ansätzen zu verdeutlichen.This is a very simple example, but it serves to show the difference in philosophy between the two approaches. Beim Transformieren großer XML-Dokumente sind beim funktionalen Ansatz eindeutig größere Produktivitätsgewinne zu erzielen.The functional approach yields greater productivity gains for transforming larger XML documents.

Siehe auchSee Also

Modifying XML Trees (LINQ to XML) (C#) (Ändern von XML-Strukturen (LINQ to XML) (C#))Modifying XML Trees (LINQ to XML) (C#)