Skip to content

Reading and writing

SBGN-ML documents are read and written with the functions of libsbgnpy.io, which use xsdata to map the XML onto the classes of libsbgnpy.sbgn.

Reading

read_sbgn_from_file reads a document from a path, read_sbgn_from_string from a string:

from pathlib import Path

from libsbgnpy import read_sbgn_from_file

sbgn = read_sbgn_from_file(Path("examples/sbgn/adh.sbgn"))
map = sbgn.map[0]

for glyph in map.glyph:
    print(glyph.id, glyph.class_value)
for arc in map.arc:
    print(arc.id, arc.class_value, arc.source, "->", arc.target)

Reading does not validate the document against the schema, it only parses it. To check that a document follows the schema see Validation.

A file which is no well formed XML, or whose root is no SBGN-ML sbgn element, raises an xsdata.exceptions.ParserError, and the path of the file is logged:

from xsdata.exceptions import ParserError

try:
    sbgn = read_sbgn_from_file(Path("broken.sbgn"))
except ParserError as err:
    print(f"not an SBGN document: {err}")

A file is decoded with the encoding its XML declaration names, UTF-8 if it names none. A string passed to read_sbgn_from_string is already decoded, so an encoding in its declaration is ignored.

Documents are parsed as untrusted input: entities are not resolved and nothing is loaded from the network, so a document cannot read local files or reach other hosts through an external entity.

Older SBGN-ML versions

The bindings are generated from the SBGN-ML 0.3 schema. Documents in the earlier namespaces http://sbgn.org/libsbgn/0.1 and http://sbgn.org/libsbgn/0.2 are upconverted while reading, i.e., they are read like a 0.3 document and written back as one. The conversion is upconvert, which is applied by the reader and by the validator. It changes only the names of the elements and attributes, text and attribute values which mention a namespace are left as they are:

from libsbgnpy.io import upconvert

upconvert('<sbgn xmlns="http://sbgn.org/libsbgn/0.2"/>')
# '<sbgn xmlns="http://sbgn.org/libsbgn/0.3"/>'

Writing

write_sbgn_to_file writes a document to a path, write_sbgn_to_string returns it as a string:

from pathlib import Path

from libsbgnpy import write_sbgn_to_file, write_sbgn_to_string

write_sbgn_to_file(sbgn, Path("map.sbgn"))
xml_str = write_sbgn_to_string(sbgn)

The document is written in the SBGN-ML 0.3 namespace, indented with two spaces, with an XML declaration and in UTF-8. Characters which have to be escaped in XML are escaped, so a label like a < b survives the round trip:

from libsbgnpy import read_sbgn_from_string, write_sbgn_to_string

sbgn2 = read_sbgn_from_string(write_sbgn_to_string(sbgn))

The raw XML of the notes and extension elements is written as markup rather than as escaped text, see Notes and extensions.

Examples

example what it shows
read.py read a document and display its content
write.py create documents from scratch and write them