Bibliothèque Python souveraine pour lire, parser et produire des fichiers ONIX
onixlib est une bibliothèque Python souveraine pour lire, parser et produire des fichiers ONIX — le standard d'échange de métadonnées du monde du livre.
Elle fournit des façades ergonomiques sur les structures ONIX 3.0, un parser streaming adapté aux grands fichiers de distribution, et un système de registre de versions extensible.
- Onixlib
pip install onixlibPrérequis : Python ≥ 3.11.
parse() est un générateur qui désérialise chaque <Product> indépendamment,
sans jamais charger l'ensemble du fichier en mémoire — recommandé pour les flux
de distribution volumineux.
from onixlib import parse
for product in parse("notice.xml"):
print(product.isbn, product.title)
# Contributeurs
if product.author:
print("Auteur :", product.author.full_name)
for c in product.contributors:
print(f" {c.role.value} — {c.full_name}")
# Description et couverture
if product.collateral:
print("Description :", product.collateral.description)
print("Couverture :", product.collateral.cover_url)
# Date de publication et éditeur
if product.publishing:
print("Date :", product.publishing.publication_date)
print("Marque:", product.publishing.imprint_name)
# Prix
for ps in product.product_supply:
for price in ps.prices:
print(f" {price.amount} {price.currency} (type {price.price_type})")La version ONIX est auto-détectée à partir de l'attribut release de la
racine XML. Pour forcer une version :
for product in parse("notice.xml", version="3.0"):
...from onixlib import Notice
notice = Notice.parse_full("notice.xml")
print(notice.header.sender_name)
print(notice.header.sent_datetime)
for product in notice.products:
print(product.isbn, product.title)from onixlib import Notice, Product, ContributorRole
# Produit
product = Product.new(isbn="9782070360024", title="Du côté de chez Swann")
author = product.add_contributor(role=ContributorRole.A01)
author.first_name = "Marcel"
author.last_name = "PROUST"
# Notice complète
notice = Notice.new(sender_name="MON_EDITEUR", sent_datetime="20260428T000000Z")
notice.add_product(product)
xml = notice.to_xml()
print(xml)Toutes les classes suivantes s'importent directement depuis onixlib :
from onixlib import (
parse, Notice, Product,
Header, DescriptiveDetail, CollateralDetail,
PublishingDetail, ProductSupply, SupplyDetail, Price,
RelatedMaterial, RelatedProduct, RelatedWork,
Contributor, ContributorRole,
)| Paramètre | Type | Description |
|---|---|---|
source |
str | Path | BinaryIO |
Chemin ou flux binaire du fichier XML |
version |
str | None |
Forcer une version (ex. "3.0"). Auto-détecté si None. |
Retourne un générateur de Product.
Façade centrale sur un bloc <Product> ONIX.
| Attribut / méthode | Type | Description |
|---|---|---|
isbn |
str | None |
ISBN-13 ou GTIN-13 |
title |
str |
Titre principal (raccourci vers descriptive) |
author |
Contributor | None |
Premier contributeur de rôle A01 |
editor |
Product.Editor | None |
Détails de l'éditeur (raccourci vers publishing) |
price |
Product.Price | None |
Premier prix du produit (raccourci vers product_supply) |
publisher |
Product.Publisher | None |
Détails de l'éditeur (raccourci vers product_supply) |
contributors |
list[Contributor] |
Tous les contributeurs |
add_contributor(role) |
Contributor |
Ajoute un contributeur |
descriptive |
DescriptiveDetail | None |
Bloc descriptif |
collateral |
CollateralDetail | None |
Bloc collatéral |
publishing |
PublishingDetail | None |
Bloc publication |
product_supply |
list[ProductSupply] |
Blocs disponibilité/prix |
related_material |
RelatedMaterial | None |
Liens vers œuvres/produits liés |
to_xml() |
str |
Sérialisation XML ONIX |
Product.new(isbn, title, …) |
Product |
Constructeur de commodité |
Façade sur la notice ONIX complète (<ONIXMessage>).
| Attribut / méthode | Type | Description |
|---|---|---|
header |
Header |
En-tête de la notice |
products |
list[Product] |
Tous les produits |
add_product(product) |
None |
Ajoute un produit |
to_xml() |
str |
Sérialisation XML |
Notice.parse_full(source, version) |
Notice |
Chargement complet en mémoire |
Notice.new(sender_name, sent_datetime, release) |
Notice |
Création d'une notice vide |
| Propriété | Type | Description |
|---|---|---|
sender_name |
str |
Nom de l'expéditeur |
sender_gln |
str | None |
GLN de l'expéditeur |
sender_email |
str | None |
E-mail de l'expéditeur |
addressee_name |
str | None |
Nom du destinataire |
addressee_gln |
str | None |
GLN du destinataire |
message_number |
str | None |
Numéro de message |
sent_datetime |
str | None |
Horodatage d'envoi |
Header.new(sender_name, sent_datetime) |
Header |
Constructeur minimal |
| Propriété | Type | Description |
|---|---|---|
title / setter |
str |
Titre principal |
subtitle |
str | None |
Sous-titre |
product_form |
str |
Code List 150 (ex. "BC" = broché) |
product_composition |
str |
Code List 2 (ex. "00" = exemplaire unique) |
contributors |
list[Contributor] |
Tous les contributeurs |
author |
Contributor | None |
Premier auteur (A01) |
languages |
list[tuple[str, str]] |
(rôle, code_langue) |
extents |
list[tuple[str, str, str]] |
(type, valeur, unité) |
subjects |
list[tuple[str, str]] |
(code_schème, code_sujet) |
| Propriété | Type | Description |
|---|---|---|
description |
str | None |
Description produit (TextType 03) |
text_contents |
list[tuple[str, str]] |
(type_code, texte) |
cover_url |
str | None |
URL de la couverture (ResourceContentType 01) |
supporting_resources |
list[tuple[str, list[str]]] |
(type_code, [urls]) |
| Propriété | Type | Description |
|---|---|---|
imprint_name / setter |
str | None |
Marque éditoriale |
publisher_name |
str | None |
Nom de l'éditeur |
publishing_status |
str | None |
Statut de publication (List 64) |
publication_date |
str | None |
Date de publication nominale (DateRole 01) |
publishing_dates |
list[tuple[str, str]] |
(rôle, date) |
for ps in product.product_supply:
for sd in ps.supply_details:
print(sd.supplier_name, sd.availability)
for price in sd.prices:
print(price.amount, price.currency, price.price_type)| Classe | Propriétés clés |
|---|---|
ProductSupply |
supply_details, availability, supplier_name, prices (aplatis) |
SupplyDetail |
supplier_name, availability, prices |
Price |
amount: Decimal, currency, price_type |
| Propriété | Type | Description |
|---|---|---|
first_name / setter |
str |
Prénom(s) |
last_name / setter |
str |
Nom de famille |
full_name |
str |
"Prénom NOM" |
role |
ContributorRole | None |
Code List 17 (ex. A01 = auteur) |
ContributorRole est l'enum List17 ONIX : ContributorRole.A01, ContributorRole.B06, etc.
onixlib intègre un registre de versions extensible. La version 3.0 est enregistrée par défaut.
from onixlib import available_releases
print(available_releases()) # ['3.0']Le parser auto-détecte la version depuis l'attribut release de la racine XML.
Lorsque EDItEUR publie une nouvelle version des XSD (ex. ONIX 3.1), voici le processus complet pour l'intégrer.
Dans xsd_sources.toml, ajouter une entrée :
[versions."3.1"]
source = "https://www.editeur.org/files/ONIX%203/ONIX_3-1_reference_XSD.zip"
description = "ONIX 3.1 — prochaine version de référence (EDItEUR)"make generate VERSION=3.1
# ou, pour forcer le re-téléchargement des XSD :
make generate-force VERSION=3.1Cela produit src/onixlib/models/generated/v3_1.py via xsdata.
Dans src/onixlib/models/versions.py, ajouter en bas du fichier :
from .generated import v3_1 as _v3_1
register(VersionInfo(
release="3.1",
namespace="http://www.editeur.org/onix/3.1/reference",
module=_v3_1,
message_class=_v3_1.Onixmessage,
product_class=_v3_1.Product,
))# Auto-détection depuis release="3.1" dans le XML
for product in parse("notice_3_1.xml"):
...
# Ou explicitement :
notice = Notice.parse_full("notice_3_1.xml", version="3.1")Les versions antérieures ("3.0") restent disponibles sans modification.
python -m venv venv
source venv/bin/activate
make install-dev| Commande | Description |
|---|---|
make generate-all |
Génère les modèles pour toutes les versions de xsd_sources.toml |
make generate VERSION=3.0 |
Génère les modèles pour une version spécifique |
make generate-from SOURCE=url VERSION=3.1 |
Génère depuis une URL externe |
make generate-force VERSION=3.0 |
Re-télécharge les XSD et régénère |
make verify-xsd |
Vérifie l'intégrité des XSD (checksums .meta.toml) |
make list-versions |
Liste les versions enregistrées et leur statut |
make docs |
Génère la documentation Sphinx (HTML) dans docs/build/html/ |
make docs-copy |
Copie documentations/sphinxdoc/ vers docs/ |
make docs-serve |
Lance un serveur local sur la doc générée (port 8080) |
make clean-generated |
Supprime les modèles générés (demande confirmation) |
Rémi Verschuur · Audit IO · 2026
