Navigation & Inspektion SVG – Aspose.SVG für .NET

Manchmal müssen Sie den Inhalt von SVG-Dateien überprüfen, um beispielsweise Informationen über die Datei, die Elemente und die Hierarchie zu erhalten. Aspose.SVG für .NET API ist vollständig kompatibel mit offiziellen SVG-Spezifikationen und kann zum Durchlaufen des SVG Document Object Model (DOM) verwendet werden. Die API unterstützt eine Vielzahl von Navigations- und Inspektionsfunktionen der SVG-Inhalte.

In diesem Abschnitt erfahren Sie:

Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen. Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.

SVG-Inhalt anzeigen

Der einfachste Weg, den Dokumentinhalt zu überprüfen, besteht darin, den Inhalt als Zeichenfolge zu betrachten. Die Eigenschaften InnerHTML und OuterHTML der Klasse Element geben ein XML- (oder HTML-) Fragment zurück, das das Element und seinen Inhalt darstellt. Sie wurden speziell für die Anzeige von SVG-Inhalten als String entwickelt. Das folgende Codebeispiel zeigt, wie der Inhalt der Datei bezier-curves.svg in der Konsole angezeigt wird.

 1using Aspose.Svg;
 2using System.IO;
 3...
 4
 5    string documentPath = Path.Combine(DataDir, "bezier-curves.svg");
 6
 7	// Load an SVG document
 8	using (var document = new SVGDocument(documentPath))
 9	{
10	     var html = document.DocumentElement.OuterHTML;
11
12	     Console.WriteLine(html);
13	}	
14	// View the document content
15	

Extrahieren Sie Informationen zu einem bestimmten SVG-Element

Das folgende Beispiel zeigt, wie Informationen zu einem bestimmten SVG-Element aus einer Datei shapes.svg extrahiert werden:

 1using Aspose.Svg;
 2using System.IO;
 3using System.Linq;
 4...
 5
 6    //Load a document from a file
 7    string documentPath = Path.Combine(DataDir, "shapes.svg");
 8
 9    using (var document = new SVGDocument(documentPath))
10    {
11        // Get the root svg element of the document
12    	var svg = document.DocumentElement;
13
14    	// Find the first child element with a given tag name
15        var g = svg.GetElementsByTagName("g").First() as SVGGElement;
16
17        var rect = g.FirstElementChild as SVGRectElement;
18
19        Console.WriteLine("Height: {0}", rect.Height);// 90
20        Console.WriteLine("Width: {0}", rect.Width); // 100
21    }

Im Beispiel ermöglicht die Verwendung der Eigenschaft DocumentElement den direkten Zugriff auf das Element <svg> des Dokuments. Die Methode GetElementsByTagName() der Klasse Element gibt eine NodeList aller Nachkommenelemente mit einem bestimmten Tag-Namen zurück; In diesem Fall ist das Rückgabeelement das erste <g>-Element. Die Eigenschaft FirstElementChild gibt den ersten untergeordneten Elementknoten dieses Elements zurück. Im Beispiel ist das erste untergeordnete Element im Element <g> das Element <rect>, für das die Werte für Breite und Höhe gedruckt werden.

Inspektion eines SVG-Dokuments und seiner Elemente

Aspose.SVG enthält eine Liste von Methoden, die auf den Element Traversal Specifications basieren. Mit der API ( shapes.svg) können Sie eine detaillierte Prüfung des Dokuments und seiner Elemente durchführen. Das folgende Codebeispiel zeigt die allgemeine Verwendung von Element Traversal-Funktionen.

 1using Aspose.Svg;
 2using System.IO;
 3...
 4
 5    // Load a document
 6	string documentPath = Path.Combine(DataDir, "shapes.svg");
 7
 8    using (var document = new SVGDocument(documentPath))
 9    {
10        var element = document.DocumentElement;
11        Console.WriteLine(element.TagName); // svg
12        
13        element = element.LastElementChild;
14        Console.WriteLine(element.TagName); // g
15
16        element = element.FirstElementChild;
17        Console.WriteLine(element.TagName); // rect
18    }

Das Element <svg> ist ein Container und wird als äußerstes Element von SVG-Dokumenten verwendet. Um auf das Element <svg> zu verweisen, können Sie verschiedene Möglichkeiten anwenden:

1var svgElement = document.RootElement;

Die Eigenschaft LastElementChild der Klasse Document gibt das letzte untergeordnete Element des Elements <svg> zurück. Es ist das <g>-Element. Gemäß dem obigen Codeausschnitt wird das variable Element erneut überladen und die Eigenschaft FirstElementChild gibt das erste untergeordnete Element des <g>-Elements zurück. Es ist das <rect>-Element.

Benutzerdefinierte Filterverwendung

Mit der Aspose.SVG-API können Sie benutzerdefinierte Filter definieren und diese zum Durchlaufen der Dokumentelemente verwenden, wie im folgenden Codebeispiel gezeigt:

 1using Aspose.Svg;
 2using System.IO;
 3using Aspose.Svg.Dom;
 4using Aspose.Svg.Dom.Traversal.Filters;
 5...
 6
 7    using (var document = new SVGDocument(Path.Combine(DataDir, "shapes.svg")))
 8    {
 9        // Create a node iterator
10        using (var iterator = document.CreateNodeIterator(document, NodeFilter.SHOW_ALL, new RectFilter()))
11        {
12            Node node;
13            while ((node = iterator.NextNode()) != null)
14            {
15                Console.WriteLine((node as Element)?.OuterHTML);
16            }
17        }
18    }

where the RectFilter class is defined as follows:

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

Die Methode CreateNodeIterator(Node, Int64, INodeFilter) der Schnittstelle IDocumentTraversal erstellt einen neuen Iterator, der am angegebenen Node (in unserem Beispiel ist es das document) verwurzelt ist. Als Parameter benötigt die Methode Node, das Flag Int64, das Knotentypen für den Iterator angibt, und den zu verwendenden INodeFilter (in unserem Beispiel ist es RectFilter()).

Die Klasse RectFilter erbt von der Klasse NodeFilter die Methode AcceptNode(Node n). Die Methode nimmt einen Node und testet, ob er den Filter besteht oder nicht; Die Methode gibt einen Short zurück, der angibt, ob der Knoten gefunden wurde oder nicht.

Im Iterator verwenden wir die Methode NextNode() der Schnittstelle INodeIterator, um auf alle Knoten des Dokuments zuzugreifen. Der erste Aufruf von NextNode() gibt den ersten Knoten zurück und verschiebt die Position des Iterators in der Menge. Die Eigenschaft OuterHTML der Klasse Element gibt den Inhalt des Elements zurück, das gedruckt wird.

Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen. Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.

Bearbeiten Sie SVG mit dem CSS-Selektor

Aspose.SVG für .NET implementiert auch die CSS-Selektor-Spezifikation, die es Ihnen ermöglicht, mithilfe eines CSS-ähnlichen Stils durch das Dokument zu navigieren.

Mit der Methode QuerySelector(selector) der Klasse Element können Sie das erste Element im Dokument abrufen, das mit dem angegebenen Selektor übereinstimmt. Die Methode QuerySelectorAll(selector) verwendet als Parameter den Abfrageselektor und gibt eine NodeList aller Elemente zurück, die mit dem Selektor übereinstimmen. An den resultierenden Elementen können Sie verschiedene Manipulationen vornehmen: Text, Attribute, CSS-Stile usw. ändern.

In den folgenden Beispielen verwenden wir die Methoden QuerySelector() und QuerySelectorAll() zur Navigation durch ein SVG-Dokument und suchen nach den benötigten Elementen.

Beispiel 1

In Beispiel 1 bearbeiten wir die Quelldatei owl.svg – das Eulen-SVG-Bild, das durch die Elemente <path> und <circle> gezeichnet wird.

Verwendung des CSS-Selektors:

 1using Aspose.Svg;
 2using System.IO;
 3using Aspose.Svg.Dom;
 4using Aspose.Svg.Collections;
 5...
 6
 7    using (var document = new SVGDocument(new Url("https://docs.aspose.com/svg/files/owl.svg")))
 8    {
 9        // Get root svg element of the document
10        var svgElement = document.RootElement;
11
12        // Find the first element that matches the specified in selector – g element
13        SVGGElement gElement = svgElement.QuerySelector("g") as SVGGElement;
14
15        // Find all circle elements in g element
16        NodeList circleNodes = gElement.QuerySelectorAll("circle");
17
18        // Make big blue eyes
19        foreach (Node circleNode in circleNodes)
20        {
21            SVGCircleElement circleElement = circleNode as SVGCircleElement;
22
23            circleElement.R.BaseVal.Value *= 1.5F;
24            circleElement.SetAttribute("stroke", "blue");
25        }
26
27        // Get path for an owl wing
28        SVGPathElement wingPath = gElement.QuerySelector("path:nth-child(2)") as SVGPathElement;
29    
30        // Apply style attributes to the wing
31        wingPath.SetAttribute("stroke-width", "16");
32        wingPath.SetAttribute("stroke-dasharray", "2 8");
33
34        document.Save(OutputDir + "owl-edited1.svg");
35    }

Sie können die bearbeitete SVG-Datei anzeigen und speichern, indem Sie dem Link owl-edited1.svg folgen.

Beispiel 2

In diesem Beispiel zeigen wir, wie Sie mit dem CSS-Selektor zu Bearbeitungszwecken durch ein Dokument navigieren. Wir bearbeiten weiterhin die Quelldatei owl.svg:

Wir erstellen ein neues <g>-Element, fügen darin die gemeinsamen Attribute für Kinder hinzu (es werden neue quadratische Augen sein) und hängen es als letztes untergeordnetes Element im <svg>-Element an (siehe SVG-Datei bearbeiten); Mit der Methode QuerySelectorAll(“g:first-child > circle”) finden wir alle Kreise im ersten <g>-Element; Dann erstellen wir <rect>-Elemente mit den Größenattributen, fügen Rechtecke in das zweite <g>-Element ein und entfernen die Kreiselemente.

Der folgende Codeausschnitt zeigt, wie Sie diese Aufgabe realisieren:

 1using Aspose.Svg;
 2using System.IO;
 3using Aspose.Svg.Dom;
 4using Aspose.Svg.Collections;
 5...
 6
 7    // Create a new g element with style attributes and append it as the last child in svg element
 8    var gElement = (SVGGElement)document.CreateElementNS(SvgNamespace, "g");
 9    gElement.SetAttribute("fill", "none");
10    gElement.SetAttribute("stroke-width", "2");
11    svgElement.AppendChild(gElement);
12
13    // Find all circle elements from the first g element
14    NodeList circleNodes = svgElement.QuerySelectorAll("g:first-child > circle");
15
16    // Make square sky-blue eyes
17    foreach (Node circleNode in circleNodes)
18    {
19        var circleElement = circleNode as SVGCircleElement;
20
21        float cx = circleElement.Cx.BaseVal.Value;
22        float cy = circleElement.Cy.BaseVal.Value;
23        float r = circleElement.R.BaseVal.Value;
24
25        var rectElement = (SVGRectElement)document.CreateElementNS(SvgNamespace, "rect");
26        rectElement.X.BaseVal.Value = cx - r;
27        rectElement.Y.BaseVal.Value = cy - r;
28        rectElement.Width.BaseVal.Value = 3 * r;
29        rectElement.Height.BaseVal.Value = 3 * r;
30        rectElement.SetAttribute("stroke", "SkyBlue");
31
32        // Add the rectangle element into the last (new) g element 
33        gElement.AppendChild(rectElement);
34
35    	// Remove the circle elements
36        circleElement.Remove();
37    }
38    // Recolor last rectangle in the last (new) g element
39    Element lastRect = gElement.LastElementChild;
40    lastRect.SetAttribute("stroke", "red");
 1using Aspose.Svg;
 2using System.IO;
 3using Aspose.Svg.Dom;
 4using Aspose.Svg.Collections;
 5...
 6
 7    // Get path for owl body from the first g element
 8    Element bodyPath = (svgElement.QuerySelector("g:first-child") as SVGGElement).FirstElementChild;
 9    bodyPath.SetAttribute("stroke", "Teal");
10
11    // Get path for owl wing from the first g element
12    SVGPathElement wingPath = svgElement.QuerySelector("g:first-child > path:nth-child(2)") as SVGPathElement;
13
14    // Form new wing path data based on the old
15    string d = "";
16    foreach (SVGPathSeg pathSeg in wingPath.PathSegList)
17    {
18        if (pathSeg is SVGPathSegMovetoAbs)
19        {
20            SVGPathSegMovetoAbs pathSegMovetoAbs = pathSeg as SVGPathSegMovetoAbs;
21
22            d += string.Format(" M {0} {1}", pathSegMovetoAbs.X, pathSegMovetoAbs.Y);
23        }
24        if (pathSeg is SVGPathSegCurvetoCubicAbs)
25        {
26            SVGPathSegCurvetoCubicAbs pathSegCurvetoCubicAbs = pathSeg as SVGPathSegCurvetoCubicAbs;
27            
28            d += string.Format(
29                " L {0} {1} L {2} {3}",
30                (pathSegCurvetoCubicAbs.X1 + pathSegCurvetoCubicAbs.X2) / 2F,
31                (pathSegCurvetoCubicAbs.Y1 + pathSegCurvetoCubicAbs.Y2) / 2F,
32                pathSegCurvetoCubicAbs.X,
33                pathSegCurvetoCubicAbs.Y
34            );
35        }
36    }
37    // Set d attribute – new path data formation
38    wingPath.SetAttribute("d", d.Trim());
39    wingPath.SetAttribute("stroke", "Teal");
40
41    document.Save(OutputDir + "owl-edited2.svg");

Auf der Abbildung: das Quellbild (a), ein bearbeitetes Bild gemäß Beispiel 1 (b), ein bearbeitetes Bild gemäß Beispiel 2 (c).

Text „Original und zwei bearbeitete Eulenbilder“

In den obigen Beispielen nehmen wir die Quelldatei owl.svg und bearbeiten einige Elemente. Wir haben versucht, die Augen und Flügel der Eule mithilfe der Navigations- und Inspektionsfunktionen der Aspose.SVG-API auf verschiedene Weise zu dekorieren. Sie können die bearbeitete SVG-Datei anzeigen und speichern, indem Sie dem Link owl-edited2.svg folgen.

XPath Query ( XML Path Language), oft einfach als XPath bezeichnet, ist eine Abfragesprache, die zum Abfragen von Daten aus Dokumenten verwendet wird. Es basiert auf einer DOM-Darstellung des SVG-Dokuments und wählt Knoten nach verschiedenen Kriterien aus. Die Syntax der XPath-Ausdrücke ist recht einfach, und was noch wichtiger ist, sie ist leicht zu lesen und zu unterstützen.

Aspose.SVG verfügt außerdem über eine leistungsstarke XPath-Spezifikationsimplementierung sowie Traversal-Spezifikationen. Dadurch können Sie XPath Query verwenden, um durch das Dokument ( shapes.svg) zu navigieren, wie im folgenden Codebeispiel gezeigt:

 1using Aspose.Svg;
 2using System.IO;
 3using Aspose.Svg.Dom;
 4using Aspose.Svg.Collections;
 5...
 6
 7    using (var document = new SVGDocument(Path.Combine(DataDir, "shapes.svg")))
 8    {
 9        //  Evaluate XPath expression
10        var xpathResult = document.Evaluate("//rect[@x='120']", document, null, (Dom.XPath.XPathResultType)XPathResultType.Any, null);
11
12        //  Get the next evaluated node
13        Console.WriteLine((xpathResult.IterateNext() as Element)?.OuterHTML); 
14    }

Sie können die vollständigen Beispiele und Datendateien von GitHub herunterladen.

Informationen zum Herunterladen von GitHub und zum Ausführen von Beispielen finden Sie im Abschnitt So führen Sie die Beispiele aus.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.