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:
- wie man einen SVG-Inhalt als String anzeigt;
- wie man mithilfe der API eine detaillierte Prüfung des Dokuments und seiner Elemente durchführt;
- Welche Möglichkeiten gibt es, Informationen zu einem bestimmten Element aus der SVG-Datei zu erhalten?
- über die Verwendung benutzerdefinierter Filter zum Durchlaufen der Dokumentelemente;
- wie man mit CSS Selector oder XPath Query durch das Dokument navigiert.
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
Navigation und Inspektion SVG mit DOM
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:
- Die Eigenschaft
DocumentElement
der Klasse Document ermöglicht den direkten Zugriff auf das Element<svg>
des Dokuments. Im obigen Codeausschnitt verwenden wir diese Methode. - Die Eigenschaft
RootElement
der Klasse SVGDocument gibt das Stammelement<svg>
in der Dokumenthierarchie zurück. Um das Element<svg>
anzugeben, können Sie den folgenden Code 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.
- Wir finden alle Kreiselemente im SVG-Dokument und ändern ihre Eigenschaften. – Machen Sie große blaue Augen für die Eule.
- Wir finden das Wegelement für einen Flügel der Eule und dekorieren es.
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:
- Im ersten Teil von Beispiel 2 werden die runden Augen der Eule in quadratische umgewandelt und neu eingefärbt.
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");
- Im zweiten Teil von Beispiel 2 wird der Pfad des Eulenflügels von der Kurve in eine Polylinie geändert und neu eingefärbt.
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).
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.
Navigieren Sie durch SVG mit XPath-Abfrage
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.