Skip to main content

Import complex XML files to a relational database

Project description

Loading XML files into a relational database

xml2db is a Python package that parses and loads XML files into a relational database. It handles complex XML files which cannot be denormalized to flat tables, and works out of the box, without any custom mapping rules.

It fits naturally into an Extract, Load, Transform pipeline: it loads XML files into a relational data model that stays close to the source data while remaining easy to query as flat database tables. The raw data can then be transformed using DBT, SQL views, or stored procedures to produce more user-friendly tables.

Starting from an XSD schema which represents a given XML structure, xml2db builds a data model, i.e. a set of database tables linked to each other by foreign keys relationships. Then, it allows parsing and loading XML files into the database, and getting them back from the database into XML format if needed.

This package uses sqlalchemy to interact with the database, so it should work with different database backends. Automated integration tests run against PostgreSQL, MySQL, MS SQL Server and DuckDB. You may have to install additional packages to connect to your database (e.g. psycopg2 or psycopg for PostgreSQL, pymysql or mysqlclient for MySQL, pyodbc for MS SQL Server, or duckdb-engine for DuckDB).

Please read the package documentation website for all the details!

Installation

The package can be installed, preferably in a virtual environment, using pip:

pip install xml2db

CLI

After installation, xml2db is available as a command-line tool with three subcommands.

Explore your XSD schema and configure the data model interactively in a browser:

xml2db serve path/to/schema.xsd

This opens a page with an Entity Relationship Diagram, source/target tree views, DDL output, and a live YAML config editor with autocomplete.

Import an XML file directly from the command line:

xml2db import file.xml schema.xsd \
    --connection-string "postgresql+psycopg2://user:pw@host/db" \
    --config model_config.yml

Render the ERD, trees, or DDL to stdout or a file without starting a server:

xml2db render schema.xsd --format erd
xml2db render schema.xsd --format ddl --db-type postgresql

See the CLI reference for all options.

Python API

Loading XML files into a relational database with xml2db can be as simple as:

from xml2db import DataModel

# Create a data model of tables with relations based on the XSD file
data_model = DataModel(
    xsd_file="path/to/file.xsd", 
    connection_string="postgresql+psycopg2://testuser:testuser@localhost:5432/testdb",
)
# Parse an XML file based on this XSD
document = data_model.parse_xml(
    xml_file="path/to/file.xml"
)
# Insert the document content into the database
document.insert_into_target_tables()

Testing

Running the tests requires installing additional development dependencies, after cloning the repo, with:

pip install -e .[tests,docs]

Run all tests with the following command:

python -m pytest

Integration tests require write access to a PostgreSQL or MS SQL Server database; the connection string is provided as an environment variable DB_STRING. If you want to run only conversion tests that do not require a database you can run:

pytest -m "not dbtest"

Contributing

xml2db is developed and used at the French energy regulation authority (CRE) to process complex XML data.

Contributions are welcome, as well as bug reports, starting on the project's issue page.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xml2db-0.14.0.tar.gz (72.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xml2db-0.14.0-py3-none-any.whl (72.3 kB view details)

Uploaded Python 3

File details

Details for the file xml2db-0.14.0.tar.gz.

File metadata

  • Download URL: xml2db-0.14.0.tar.gz
  • Upload date:
  • Size: 72.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xml2db-0.14.0.tar.gz
Algorithm Hash digest
SHA256 93844280dc61c64ea6e9459e92fa82c5b67bc3095483430a1416a3a303253915
MD5 bd89cbe2432454b8adf3d056cc4e974b
BLAKE2b-256 b205b082016a2f6873c93c7a292cfa2ecc0194a1912db3b8594bd76333e83cd5

See more details on using hashes here.

Provenance

The following attestation bundles were made for xml2db-0.14.0.tar.gz:

Publisher: publish-to-pypi.yml on cre-dev/xml2db

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xml2db-0.14.0-py3-none-any.whl.

File metadata

  • Download URL: xml2db-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 72.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for xml2db-0.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 28418de44d27c69c1816905e2e59806b8243b317481075f3b5b43979cc81aa99
MD5 23b68881a8ec459d9db84b9406b5c35f
BLAKE2b-256 4739960a1b3952ec023766468eb5b382652bf7625d6fff4f06d57866a19e061e

See more details on using hashes here.

Provenance

The following attestation bundles were made for xml2db-0.14.0-py3-none-any.whl:

Publisher: publish-to-pypi.yml on cre-dev/xml2db

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page