std.svg.parser
SVG-Leser: eine vorhandene .svg-Datei öffnen, den Baum durchlaufen, Elemente nach id oder Tag finden und Attribute auslesen. Schreiben kann der Parser nicht.
Knoten und Dokument sind int64-Handles; ein nicht vorhandener Knoten ist 0, nicht null. Eigene Typen (SvgDoc, SvgNode, SvgNodeList) gibt es nicht.
→ std.svg · std.svg.builder · std.svg.xml
Verwendung
import std.io;
import std.svg.parser;
fn main(): int64 {
var doc: int64 := SvgOpen("in.svg");
if (doc == 0) { PrintLn("nicht lesbar"); return 1; }
var vb: pchar := SvgReadViewBox(doc);
Print("viewBox: "); Print(vb); Print("\n");
// Kinder der Wurzel durchlaufen
var root: int64 := SvgRootElement(doc);
var child: int64 := SvgFirstChild(root);
while (child != 0) {
var tag: pchar := SvgElementTag(child);
var fill: pchar := SvgAttrStr(child, "fill");
Print(" <"); Print(tag); Print("> fill="); Print(fill); Print("\n");
child := SvgNextSibling(child);
}
Print("Kreise: "); PrintLn(IntToStr(SvgCountByTag(doc, "circle")));
SvgParserFree(doc);
return 0;
}
Eingabe:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="300" viewBox="0 0 400 300">
<circle id="logo" cx="120" cy="80" r="40" fill="red"/>
<circle cx="220" cy="80" r="25" fill="blue"/>
<rect x="10" y="200" width="100" height="50"/>
</svg>
Ausgabe:
viewBox: 0 0 400 300
<circle> fill=red
<circle> fill=blue
<rect> fill=
Kreise: 2
Ein Attribut, das es nicht gibt, liefert 0 als pchar — Print gibt dafür nichts aus (siehe die rect-Zeile).
Die Zahlenseite des Parsers ist derzeit unbrauchbar (#1687):SvgReadWidth,SvgReadHeightundSvgAttrF64liefern das IEEE-Bitmuster als Zahl (400.0kommt als4645744490609377280zurück). Bis zur Behebung hilft nur der Umweg überSvgAttrStrund eigenes Umwandeln.
Die Zeichenkettenseite —SvgAttrStr,SvgElementTag,SvgElementId,SvgReadViewBox,SvgFindId,SvgCountByTag— arbeitet korrekt; das obige Beispiel ist damit gemessen.
Funktionen
| Signatur | Sichtbarkeit | Beschreibung |
|---|---|---|
SvgOpen(path: pchar): int64 | pub | Datei einlesen und Baum bauen; 0 bei Fehler |
SvgGetError(doc: int64): pchar | pub | Fehlertext des letzten Öffnens |
SvgReadWidth(doc: int64): f64 | pub | Breite (siehe Kasten) |
SvgReadHeight(doc: int64): f64 | pub | Höhe (siehe Kasten) |
SvgReadViewBox(doc: int64): pchar | pub | viewBox als Zeichenkette |
SvgRootElement(doc: int64): int64 | pub | Wurzelknoten |
SvgFirstChild(elem: int64): int64 | pub | Erstes Kind, sonst 0 |
SvgNextSibling(elem: int64): int64 | pub | Nächstes Geschwister, sonst 0 |
SvgElementTag(elem: int64): pchar | pub | Tag-Name |
SvgElementId(elem: int64): pchar | pub | id des Knotens |
SvgAttrStr(elem: int64, name: pchar): pchar | pub | Attributwert als Zeichenkette, sonst 0 |
SvgAttrF64(elem: int64, name: pchar, defaultVal: f64): f64 | pub | Attributwert als Zahl mit Vorgabe (siehe Kasten) |
SvgPathData(elem: int64): pchar | pub | Das d-Attribut eines Pfads |
SvgFindId(doc: int64, id: pchar): int64 | pub | Knoten mit dieser id |
SvgCountByTag(doc: int64, tag: pchar): int64 | pub | Anzahl der Knoten mit diesem Tag |
SvgParserFree(doc: int64): void | pub | Baum freigeben |
Nicht vorhanden: SvgDocRoot, SvgDocWidth, SvgDocHeight, SvgNodeFirstChild, SvgNodeNext, SvgNodeTag, SvgFindById, SvgFindByTag und die ganze SvgNodeList-Familie — frühere Fassungen dieser Seite führten sie auf.
Letzte Aktualisierung: 2026-08-19 — Seite gegen die echten Signaturen neu geschrieben; Beispiel mit lyxc 1.1.3I übersetzt und gegen die oben gezeigte Eingabedatei ausgeführt, Ausgabe übernommen. Befund zur Zahlenseite als #1687 gemeldet.
