Aller au contenu

Écrire et lire un dictionnaire

Sous les couches tabulaires, deux fonctions génériques fonctionnent pour tout message HPRIM XML, sans code spécifique : parse_xml lit un message en dictionnaire, to_xml l'écrit. C'est la voie à utiliser pour un message ou un élément que les tables ne couvrent pas encore.

import pyhprimxml as hx

msg = hx.parse_xml("data/xml_tests/actes/00001.xml")
evt = msg["evenementsServeurActes"]["evenementServeurActe"]   # un seul événement par message
evt["actesCCAM"]["acteCCAM"][0]["codeActe"]           # 'EBLA003'

hx.write_xml(msg, "copie.xml", xmlns=None)

Format du dictionnaire

C'est le format de xmltodict.

  • Le dictionnaire a une seule clé : l'élément racine.
  • Attributs et éléments enfants sont des clés du même dictionnaire ; le préfixe @ est accepté mais facultatif, c'est le XSD qui tranche.
  • Un élément répété est une liste.
  • Un élément à contenu simple portant des attributs utilise la clé #text.
  • L'ordre des clés n'a pas d'importance : les enfants sont émis dans l'ordre du XSD.

Un dictionnaire produit par xmltodict.parse est donc accepté tel quel par to_xml.

parse_xml

Par rapport à xmltodict, parse_xml s'appuie sur le XSD : les éléments répétables sont toujours des listes, et les valeurs sont typées (date, datetime, time, int). typed=False garde tout en texte. Le namespace est ignoré.

to_xml et write_xml

Options propres au dictionnaire, en plus de xmlns, version, encoding et validate_xsd :

option défaut effet
drop_empty True supprime éléments et attributs vides, sauf les éléments complexes obligatoires
strict True une clé inconnue du XSD lève une erreur (sinon : avertissement)
pretty True indentation de deux espaces, mise en forme par libxml2 (comme xml2 en R)

Avec drop_empty=False, l'aller-retour parse_xml → to_xml reproduit les fichiers d'exemple à l'identique, éléments vides compris.

La déclaration XML est écrite avec des guillemets doubles (<?xml version="1.0" encoding="UTF-8" standalone="yes"?>), comme dans les fichiers produits par les DPI.