Skip to main content

pyRegRep

Бібліотека Python для парсування та обробки XML документів у форматі RIM (Registry Information Model) / ebXML.

Опис

pyRegRep — інструмент для роботи з XML документами стандарту Registry Information Model (RIM), що застосовується в системах eGovernment та обміну даними (зокрема, OOTS/EDM). Бібліотека дозволяє легко витягувати, аналізувати та серіалізувати дані з RIM/ebXML документів, а також програмно створювати коректні RIM-слоти різних типів.

Можливості

  • ✅ Парсування RIM/ebXML XML документів (bytes або str)
  • ✅ Автоматична обробка просторів імен (namespaces)
  • ✅ Витягування запитів (Query), винятків (Exception) та об'єктів реєстру (RegistryObject)
  • ✅ Обробка всіх типів значень: Boolean, String, Integer, DateTime, Collection, InternationalString, AnyValue
  • ✅ Серіалізація даних у зручний Python-формат (dict)
  • ✅ Фабрика слотів get_slot() — програмне створення RIM-слотів за типом
  • ✅ Builder-класи для елементів RegistryObject, RepositoryItemRef, QueryResponse, Classification
  • ✅ Серіалізація AnyValueType через xmltodict (параметр any_type=True)
  • ✅ Підтримка вкладених колекцій та складних структур
  • ✅ Безпечний доступ до вкладених даних через deep_get()

Вимоги

  • Python: >= 3.10
  • Залежності:
    • lxml >= 5.2.1 — робота з XML
    • xmltodict >= 0.13.0 — серіалізація AnyValueType

Установка

Проєкт використовує uv як менеджер залежностей і середовище розробки.

# Створити віртуальне середовище та встановити пакет з dev-залежностями
uv sync --extra dev

# Або встановити лише пакет без dev-залежностей
uv pip install -e .

Після цього можна запускати команди через uv run, наприклад:

uv run pytest
uv run ruff check .

Швидкий старт

Парсування XML документу

from pyRegRep4.RIMParsing import Parsing

with open("document.xml", "rb") as f:
    parser = Parsing(f.read())

# Усі слоти у вигляді {category: {name: (type, value)}}
print(parser.slots)

# Серіалізовані дані (без типової інформації)
print(parser.serialize())

# Серіалізація з обробкою AnyValueType в dict
print(parser.serialize(any_type=True))

from pyRegRep4 import deep_get

# Безпечний доступ до вкладених ключів
spec_id = deep_get(parser.serialize(), "doc", "SpecificationIdentifier", default="unknown")
print(spec_id)

Програмне створення RIM-слотів

import datetime
from lxml import etree
from pyRegRep4.RIMElement import get_slot

# Текстовий слот
slot = get_slot("SpecificationIdentifier", "StringValueType", "oots-edm:v1.2")
print(slot.name)   # 'SpecificationIdentifier'
print(slot.value)  # 'oots-edm:v1.2'
print(slot.text)   # XML як bytes

# Логічний слот
slot = get_slot("PossibilityForPreview", "BooleanValueType", True)

# Слот дата/час
slot = get_slot("IssueDateTime", "DateTimeValueType", datetime.datetime.now())

# Багатомовний слот через dict-список
slot = get_slot(
    "Title",
    "InternationalStringValueType",
    [
        {"lang": "en", "text": "Birth Certificate"},
        {"lang": "uk", "text": "Свідоцтво про народження"},
    ],
)

# Довільний XML (AnyValueType)
elem = etree.Element("CustomData")
elem.text = "Payload"
slot = get_slot("CustomPayload", "AnyValueType", elem)

API Довідник

Клас Parsing (pyRegRep4.RIMParsing)

Конструктор

Parsing(doc: bytes | str)
Параметр Тип Опис
doc bytes | str XML документ

Атрибути

Атрибут Тип Опис
xml str XML як рядок
doc etree._Element Розібраний XML документ
query etree._Element | None Елемент Query (якщо є)
exception etree._Element | None Елемент Exception (якщо є)
objects list Список RegistryObject елементів
slots dict Всі слоти у форматі {category: {name: (type, value)}}

Категорії slots: "doc", "query", "exception", "object".

Метод serialize(any_type: bool = False) -> dict

Серіалізує слоти в чистий Python-формат, видаляючи типову інформацію.

Тип значення Python-результат
BooleanValueType bool
StringValueType str
DateTimeValueType str (ISO format)
IntegerValueType int
CollectionValueType list
InternationalStringValueType list[dict] з ключами lang/text
AnyValueType (за замовчуванням) etree._Element
AnyValueType (з any_type=True) dict (через xmltodict)

Функція get_slot() (pyRegRep4.RIMElement)

get_slot(name: str, slot_type: str, value: Any) -> Xml

Фабрика для програмного створення RIM-слотів.

Параметр Тип Опис
name str Ім'я слота
slot_type str Тип слота (див. таблицю нижче)
value Any Значення слота

Підтримані типи:

slot_type Тип value Опис
"StringValueType" str Текстовий рядок
"BooleanValueType" bool Логічне значення
"DateTimeValueType" datetime.datetime або str Дата/час
"CollectionValueType" etree._Element Колекція елементів
"AnyValueType" etree._Element Довільний XML елемент
"InternationalStringValueType" etree._Element, list[etree._Element] або list[dict] Багатомовний текст

Повертає об'єкт Xml з властивостями:

  • name — ім'я слота
  • value — значення
  • element — XML елемент (etree._Element)
  • text — серіалізований XML (bytes)

Викидає ValueError при невідомому типі слота.

try:
    slot = get_slot("Bad", "UnknownType", "value")
except ValueError as e:
    print(e)  # Невідомий тип слота: UnknownType. Підтримувані типи: [...]

Builder-класи XML елементів (pyRegRep4.RIMElement)

Публічні класи для побудови типових елементів RIM/query:

  • RegistryObject
  • RepositoryItemRef
  • QueryResponse
  • Classification

Усі класи мають однаковий базовий контракт:

  • element — повертає etree._Element (або ValueError, якщо елемент ще не створено)
  • text — серіалізований XML (bytes)
  • create_element(...) — будує XML елемент і повертає self (chain-style)
from pyRegRep4.RIMElement import RepositoryItemRef, QueryResponse

ref = RepositoryItemRef().create_element(
    "https://example.org/document.xml",
    "Document",
)
print(ref.text)

response = QueryResponse().create_element(
    "urn:oasis:names:tc:ebxml-regrep:ResponseStatusType:Success",
    "req-1",
)
print(response.element.tag)

Функція deep_get() (pyRegRep4.utils)

deep_get(data: dict, *keys, default=None)

Безпечно дістає значення з вкладеного dict за послідовністю ключів.

Параметр Тип Опис
data dict Джерело даних
*keys Any Шлях ключів для проходу по вкладеному словнику
default Any Значення за замовчуванням, якщо шлях не знайдено

Поведінка:

  • якщо на будь-якому кроці значення не є dict — повертається default
  • якщо кінцеве значення None — повертається default
  • якщо keys не передані — повертається data
from pyRegRep4 import deep_get

data = {
    "doc": {
        "Procedure": [{"lang": "en", "value": "GetBirthCertificate"}]
    }
}

value = deep_get(data, "doc", "Procedure", 0, "value", default="n/a")
print(value)  # n/a (бо deep_get працює тільки з dict-ланцюжком)

procedure = deep_get(data, "doc", "Procedure", default=[])
print(procedure)  # [{"lang": "en", "value": "GetBirthCertificate"}]

Клас NS (pyRegRep4.NS)

Базовий клас для управління RIM namespace. Надає метод _tname(prefix, localname) для генерування кваліфікованих імен тегів у нотації Clark.


Виняток ParsingError (pyRegRep4.RIMParsing)

Базовий клас для помилок парсування. Кидається при некоректному XML або відсутньому namespace.

Структура проекту

pyRegRep/
├── pyRegRep4/
│   ├── __init__.py          # Експорт: get_slot, deep_get, Parsing, serialize_any_value_type
│   ├── RIMElement.py        # Класи слотів + фабрика get_slot()
│   ├── RIMParsing.py        # Парсер Parsing + serialize()
│   ├── utils.py             # deep_get() для вкладених словників
│   └── NS.py                # Базовий клас для namespace
├── tests/
│   ├── conftest.py          # sys.path для CI
│   ├── test_rim_parsing.py  # Тести парсера
│   ├── test_rim_element.py  # Тести get_slot() та типів слотів
│   ├── test_utils.py        # Тести deep_get()
│   ├── EDM_Ferst_Request.xml
│   ├── EDM_Ferst_Response.xml
│   ├── EDM_Second_Request.xml
│   └── EDM_Second_Response.xml
├── example/
│   ├── Example_1.py
│   ├── example_anyvaluetype_usage.py
│   └── example_get_slot_usage.py
├── pyproject.toml
├── uv.lock
├── README.md
└── .github/workflows/

Запуск тестів

# Встановити залежності проекту
uv sync --extra dev

# Усі тести
uv run pytest --disable-warnings -q

# Тільки тести парсера
uv run pytest tests/test_rim_parsing.py -v

# Тільки тести слотів
uv run pytest tests/test_rim_element.py -v

# Збірка source distribution та wheel
uv run python -m build

Логування

Бібліотека використовує стандартний logging. Для увімкнення:

import logging
logging.basicConfig(level=logging.DEBUG)

Технічні деталі

Обробка просторів імен

Namespace витягуються автоматично з кореневого елемента документа та зберігаються у parser._ns у форматі {prefix: uri}.

Формат slots

{
    "doc": {
        "SpecificationIdentifier": ("StringValueType", "oots-edm:v1.2"),
        "IssueDateTime": ("DateTimeValueType", "2024-03-15T10:30:00"),
        "PossibilityForPreview": ("BooleanValueType", "false"),
    },
    "query": {},
    "exception": {},
    "object": {}
}

Автор

Andrey Shapovalov — mt.andrey@gmail.com

Ліцензія

MIT License — див. файл LICENSE

Посилання


Версія: 15 · Оновлено: 2026-09-07

Metadata

Release files for pyRegRep 15

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyRegRep 15
File Size Uploaded
pyregrep-15.tar.gz 22.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyRegRep 15
File Interpreter ABI Platform
pyregrep-15-py3-none-any.whl Python 3 none any Details

Total release size: 37.7 kB

Release files / pyregrep-15.tar.gz

Download URL pyregrep-15.tar.gz
Size 22.4 kB
Tags Source
SHA-256 checksum
How to use checksums
316bfda4ce123c57d45e33da724cef5f6fb555dafcb9f4e24501cccd3d29e0e7
BLAKE2b-256 checksum
How to use checksums
92b4703f03cd15c91606a0cc2a87facf106e64d7490e0ffc61241a4356869509
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.

Transparency log

Release files / pyregrep-15-py3-none-any.whl

Download URL pyregrep-15-py3-none-any.whl
Size 15.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d0437437699603665b6301cfd64756118151f96eb4ffe26cc9b7b745b825f74b
BLAKE2b-256 checksum
How to use checksums
c05cb6f512f74395b7d8a6c82e2c32701153a1760dafd307a635ae55f4eb0d18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.

Transparency log

Release history Release notifications | RSS feed

16

2 release files

This release

15 This release

2 release files

14

2 release files

13

2 release files

12

2 release files

11

2 release files

10

2 release files

9

2 release files

8

2 release files

7

2 release files

6

2 release files

5

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page