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 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}")

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:

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