SVG in C# inspizieren und navigieren

Bevor Code Farben ändert, Formen ersetzt, Daten extrahiert oder ein SVG-Dokument konvertiert, muss er oft zuerst das genaue Element finden, mit dem gearbeitet werden soll. Aspose.SVG for .NET gibt C#-Code DOM-Zugriff auf SVG-Inhalte. Dadurch können Sie Markup prüfen, durch den Dokumentbaum navigieren, Elemente mit CSS-Selektoren auswählen, XPath-Abfragen auswerten und Knoten mit benutzerdefinierten Filtern durchlaufen.

In diesem Artikel lernen Sie, wie Sie:

Schnellstart: SVG-Element in C# finden

Das folgende Beispiel lädt eine SVG-Datei, findet das erste <rect>-Element mit einem CSS-Selektor und gibt das Markup des Elements aus:

 1using System;
 2using System.IO;
 3using Aspose.Svg;
 4using Aspose.Svg.Dom;
 5
 6string inputPath = Path.Combine(DataDir, "shapes.svg");
 7
 8using (SVGDocument document = new SVGDocument(inputPath))
 9{
10    // Find the first rectangle in the SVG document
11    Element rectangle = document.QuerySelector("rect");
12
13    if (rectangle == null)
14    {
15        Console.WriteLine("No <rect> element was found.");
16        return;
17    }
18
19    // Print the selected element as SVG markup
20    Console.WriteLine(rectangle.OuterHTML);
21}

Dieses Muster ist nützlich, wenn bereits klar ist, welches Element geprüft oder geändert werden soll. Die Prüfung auf null hält das Beispiel eindeutig, wenn das Eingabe-SVG das erwartete Element nicht enthält. Wenn die SVG-Struktur unbekannt ist, beginnen Sie mit DOM-Traversierung oder OuterHTML, um das Dokument zuerst zu verstehen.

SVG-Markup als Zeichenfolge anzeigen

Die Eigenschaft OuterHTML gibt das Markup eines Elements zusammen mit seinen untergeordneten Knoten zurück. Die Eigenschaft InnerHTML gibt nur den Inhalt des Elements zurück. Diese Eigenschaften eignen sich für schnelle Diagnose, Logging und die Kontrolle, welcher Teil des SVG-Dokuments ausgewählt wurde.

Dieses Beispiel gibt das Markup des Wurzelelements <svg> aus:

1using Aspose.Svg;
2using System;
 1// View SVG document content as OuterHTML in C#
 2
 3// Load an SVG document
 4using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "bezier-curves.svg")))
 5{
 6    // Use the OuterHTML property
 7    string html = document.DocumentElement.OuterHTML;
 8
 9    Console.WriteLine(html);
10}
11// View the document content

Im SVG DOM navigieren

Ein SVG-Dokument ist ein XML-basierter Baum von Knoten. Auf das Wurzelelement <svg> kann auf zwei gängige Arten zugegriffen werden:

1using Aspose.Svg;
2using Aspose.Svg.Dom;
3
4Element documentElement = document.DocumentElement;
5SVGSVGElement rootElement = document.RootElement;

Für eine einfache Traversierung innerhalb des SVG-Elementbaums verwenden Sie Element-Eigenschaften wie FirstElementChild, LastElementChild, NextElementSibling und Children. Hier meint Children die untergeordneten Elemente eines Element, zum Beispiel die Kinder von <svg> oder <g>, nicht die Sammlung Document.Children. Das folgende Beispiel geht vom Dokumentelement zu verschachtelten Kindelementen und gibt deren Tag-Namen aus:

1using Aspose.Svg;
2using System;
3using System.IO;
 1// Traverse SVG document elements using the DOM in C#
 2
 3// Load an SVG document
 4using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "shapes_svg.svg")))
 5{
 6    // Get direct access to the <svg> element of the document
 7    Element element = document.DocumentElement;
 8    Console.WriteLine(element.TagName); // svg
 9
10    // Use the LastElementChild property
11    element = element.LastElementChild;
12    Console.WriteLine(element.TagName); // g
13
14    // Use the FirstElementChild property
15    element = element.FirstElementChild;
16    Console.WriteLine(element.TagName); // rect
17}

Elemente nach Tag-Namen finden

Verwenden Sie GetElementsByTagName(), wenn Sie alle Nachfahren mit demselben SVG-Tag benötigen, zum Beispiel alle <circle>- oder <rect>-Elemente. Die Methode gibt eine NodeList zurück, die im Code geprüft oder weiter gefiltert werden kann.

Das folgende Beispiel findet das erste <g>-Element, liest sein erstes Kindelement und gibt Breite und Höhe dieses <rect>-Elements aus:

1using Aspose.Svg;
2using System;
3using System.IO;
4using System.Linq;
 1// Extract information about a specific SVG element in C#
 2
 3string documentPath = Path.Combine(DataDir, "shapes_svg.svg");
 4
 5// Load a document from a file
 6using (SVGDocument document = new SVGDocument(documentPath))
 7{
 8    // Get the root <svg> element of the document
 9    Element svg = document.DocumentElement;
10
11    // Find the first child element with a given tag name
12    SVGGElement g = svg.GetElementsByTagName("g").First() as SVGGElement;
13    SVGRectElement rect = g.FirstElementChild as SVGRectElement;
14
15    Console.WriteLine("Height: {0}", rect.Height); // 100
16    Console.WriteLine("Width: {0}", rect.Width); // 100
17}

SVG-Elemente mit CSS-Selektoren finden

CSS-Selektoren sind oft der kürzeste Weg, um Elemente nach Tag-Namen, ID, Klasse, Attributen oder Position im SVG-Baum zu finden. QuerySelector() gibt das erste passende Element zurück. QuerySelectorAll() gibt alle passenden Elemente als NodeList zurück.

Das folgende Beispiel verwendet einen Attributselektor, um nur Rechtecke zu finden, deren Inline-Style FireBrick enthält, und gibt anschließend deren id-Werte aus. Das ist eine gezieltere Suche, als jedes <rect>-Element in der Datei auszuwählen.

 1using System;
 2using System.IO;
 3using Aspose.Svg;
 4using Aspose.Svg.Collections;
 5using Aspose.Svg.Dom;
 6
 7string inputPath = Path.Combine(DataDir, "shapes.svg");
 8
 9using (SVGDocument document = new SVGDocument(inputPath))
10{
11    // Select only rectangles whose style attribute contains "FireBrick"
12    NodeList fireBrickRectangles = document.QuerySelectorAll("rect[style*='FireBrick']");
13
14    if (fireBrickRectangles.Length == 0)
15    {
16        Console.WriteLine("No rectangles with FireBrick in the style attribute were found.");
17        return;
18    }
19
20    foreach (Element rectangle in fireBrickRectangles)
21    {
22        Console.WriteLine(rectangle.GetAttribute("id"));
23    }
24}

Wenn das Eingabe-SVG Rechtecke mit FireBrick im Attribut style enthält, gibt das Beispiel deren id-Werte aus. Die explizite Prüfung auf ein leeres Ergebnis macht das Beispiel auch dann hilfreich, wenn keine passenden Elemente vorhanden sind.

CSS-Selektoren sind auch vor dem Bearbeiten nützlich. Größere Beispiele, in denen Elemente einer Eulenillustration ausgewählt und geändert werden, finden Sie unter SVG mit CSS-Selektoren bearbeiten.

SVG mit XPath navigieren

XPath ist hilfreich, wenn sich die Auswahlbedingung leichter als Dokumentabfrage ausdrücken lässt, etwa durch einen Attributwert oder eine Elementhierarchie. Aspose.SVG unterstützt XPath-Auswertung über Evaluate().

Das folgende Beispiel findet ein <rect>-Element, dessen Attribut x den Wert 120 hat, und gibt den ausgewählten Knoten aus:

 1using System;
 2using System.IO;
 3using Aspose.Svg;
 4using Aspose.Svg.Dom;
 5using Aspose.Svg.Dom.XPath;
 6
 7string inputPath = Path.Combine(DataDir, "shapes.svg");
 8
 9using (SVGDocument document = new SVGDocument(inputPath))
10{
11    // Evaluate the XPath expression against the SVG document
12    IXPathResult result = document.Evaluate(
13        "//rect[@x='120']",
14        document,
15        null,
16        Dom.XPath.XPathResultType.Any,
17        null);
18
19    // Read the first matching node
20    Element selectedElement = result.IterateNext() as Element;
21
22    if (selectedElement == null)
23    {
24        Console.WriteLine("No rectangle with x=\"120\" was found.");
25        return;
26    }
27
28    Console.WriteLine(selectedElement.OuterHTML);
29}

In der Beispieldatei shapes.svg wählt dieser XPath-Ausdruck das Rechteck mit id="second-rect" aus. XPath ist besonders praktisch, wenn die Bedingung attributbasiert ist oder das Zielelement leichter über seine Position im XML-Baum beschrieben werden kann.

Knoten mit NodeIterator filtern

Verwenden Sie CreateNodeIterator(), wenn die Traversierung durch das Dokument laufen soll und ein benutzerdefinierter Filter entscheidet, welche Knoten akzeptiert werden. Ein von NodeFilter abgeleiteter Filter gibt FILTER_ACCEPT für Knoten zurück, die für den Iterator sichtbar sein sollen, und FILTER_REJECT für Knoten, die übersprungen werden sollen.

Das folgende Beispiel erstellt einen Iterator, der nur <rect>-Elemente akzeptiert:

1using Aspose.Svg;
2using Aspose.Svg.Dom;
3using Aspose.Svg.Dom.Traversal.Filters;
4using System;
5using System.IO;
 1// Iterate SVG rectangle nodes with a custom NodeFilter in C#
 2
 3using (SVGDocument document = new SVGDocument(Path.Combine(DataDir, "shapes.svg")))
 4{
 5    // Create a node iterator
 6    using (INodeIterator iterator = document.CreateNodeIterator(document, NodeFilter.SHOW_ALL, new RectFilter()))
 7    {
 8        Node node;
 9        while ((node = iterator.NextNode()) != null)
10        {
11        }
12    }
13}

Die Klasse RectFilter akzeptiert Knoten, deren NodeName rect ist:

1public class RectFilter : NodeFilter
2{
3    public override short AcceptNode(Node node)
4    {
5        return string.Equals("rect", node.NodeName)
6            ? FILTER_ACCEPT
7            : FILTER_REJECT;
8    }
9}

NextNode() gibt den nächsten akzeptierten Knoten zurück und verschiebt die Iteratorposition. Das ist nützlich, wenn Sie eine wiederverwendbare Traversierungsregel benötigen und nicht nur einen einmaligen Selektor.

FAQ

1. Sollte ich CSS-Selektoren oder XPath verwenden, um SVG-Elemente zu finden?
Verwenden Sie CSS-Selektoren für typische SVG-Auswahlaufgaben, etwa nach Tag-Namen, ID, Klasse, Attributen oder Eltern-Kind-Beziehungen. Verwenden Sie XPath, wenn sich die Abfrage besser als Dokumentpfad formulieren lässt oder wenn Sie XML-orientierte Auswahlregeln benötigen.

2. Was ist der Unterschied zwischen DocumentElement und RootElement?
DocumentElement stammt aus der allgemeinen DOM-Document-API und gibt das Dokumentelement als Element zurück. RootElement gehört zu SVGDocument und gibt das Wurzelelement <svg> als SVGSVGElement zurück, das SVG-spezifische Member bereitstellt.

3. Kann ich SVG vor dem Bearbeiten oder Konvertieren inspizieren?
Ja. Ein typischer Ablauf ist: SVG-Datei laden, ihre Struktur mit OuterHTML, DOM-Traversierung, CSS-Selektoren oder XPath prüfen und erst danach ausgewählte Elemente ändern oder das Dokument an Konvertierungscode übergeben.

4. Kann ich ein erzeugtes oder bearbeitetes SVG prüfen, ohne es zuerst zu speichern?
Ja. Nach dem Erstellen oder Bearbeiten eines SVGDocument können Sie DocumentElement.OuterHTML lesen oder ausgewählte Elemente direkt im Speicher prüfen. Speichern ist nur nötig, wenn das Dokument in eine Datei, einen Stream oder ein anderes Ziel geschrieben werden soll.

Nächste Schritte