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 pcharPrint gibt dafür nichts aus (siehe die rect-Zeile).

 
Die Zahlenseite des Parsers ist derzeit unbrauchbar (#1687): SvgReadWidth, SvgReadHeight und SvgAttrF64 liefern das IEEE-Bitmuster als Zahl (400.0 kommt als 4645744490609377280 zurück). Bis zur Behebung hilft nur der Umweg über SvgAttrStr und 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.