Skip to main content

Pretty-print XML and HTML files in a light, YAML-like, readable format

Project description

Unxml

Simplify and "flatten" XML files into a YAML-like readable format.

This is a Rust clone of the original unxml F# tool.

See it in action → — a gallery of real-world XML documents, schemas, stylesheets, and Schematron rules rendered with unxml, with original-vs-rendered size comparisons.

Installation

Using uv (Easiest)

Install the published wheel from PyPI as a standalone tool:

uv tool install unxml-rs

This puts the unxml command on your PATH. To try it without installing anything:

uvx --from unxml-rs unxml <xml_file>

Pre-built Binaries (Recommended)

Download the latest release for your platform from the GitHub Releases page:

  • Linux (x86_64): unxml-linux-x86_64.tar.gz
  • Windows (x86_64): unxml-windows-x86_64.zip
  • macOS (Intel): unxml-macos-x86_64.tar.gz
  • macOS (Apple Silicon): unxml-macos-arm64.tar.gz

Extract the archive and place the unxml binary in your PATH.

From Source

git clone https://github.com/yourusername/unxml-rs
cd unxml-rs
cargo install --path .

Using Cargo

cargo install unxml

Usage

unxml <xml_file>

By default files render as plain XML. Pass --auto to pick the processing mode from each file's extension:

Extension Mode applied
.xsl .xslt --xslt
.sch --schematron
.xsd --xsd

An explicit mode flag (--xslt, --schematron, --xsd, --special) always overrides autodetection.

Each mode rewrites its vocabulary into a terser pseudocode. The full set of transformations, with side-by-side samples, is documented per format:

Syntax-highlighted output (--bat)

unxml --bat some.xsd      # implies --auto (detects --xsd), pipes through `bat -l unxml`

--bat renders the output through bat using the bundled unxml grammar (see editor/) for paged, colourised display. If bat is not installed it falls back to plain stdout.

Hiding noisy namespace prefixes (--hide-ns)

Vocabularies like UBL bury the signal under repeated prefixes (cbc:, cac:). --hide-ns drops the named prefixes from element names — and their xmlns: declarations — so the output reads as bare local names:

unxml --hide-ns cbc,cac invoice.xml   # repeatable and comma-separated

Signal-carrying prefixes you don't list (e.g. ext:, bim:) are kept, so an extension subtree still stands out.

Under --auto/--bat, unxml also sniffs the document type and hides a sensible set automatically. Currently it recognises UBL instance documents (an unprefixed root such as <Invoice> in a UBL namespace) and hides whichever prefixes are bound to the Common Basic/Aggregate Components namespaces. A stylesheet or schema that merely references UBL (e.g. an xsl:stylesheet translating to UBL) is left untouched, since there the prefixes are real syntax.

Introduction

This command line application was developed for comparing XML files (e.g. database/application state dumps). It takes an XML file and converts it to a YAML-like syntax that is easier to read and compare.

Example

Given this XML input:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <PackAsTool>true</PackAsTool>
    <Description>Unxml 'pretty-prints' xml files in light, yamly, readable format</Description>
    <PackageVersion>1.0.0</PackageVersion>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="FileSystemHelper.fs"/>
    <Compile Include="MutableCol.fs"/>
    <Compile Include="Program.fs" />
  </ItemGroup>
</Project>

The output would be:

Project
  [Sdk]: Microsoft.NET.Sdk
  PropertyGroup
    OutputType = Exe
    TargetFramework = netcoreapp2.1
    PackAsTool = true
    Description = Unxml 'pretty-prints' xml files in light, yamly, readable format
    PackageVersion = 1.0.0
  ItemGroup
    Compile
      [Include]: FileSystemHelper.fs
    Compile
      [Include]: MutableCol.fs
    Compile
      [Include]: Program.fs

Key Features

  • Attributes in Square Brackets: Element attributes are displayed as [attribute]: value
  • Text Content with Equals: Element text content is shown as ElementName = text content
  • Hierarchical Indentation: Nested elements are properly indented
  • Clean Format: Easy to read and compare, great for diffing

Technical Details

  • Built with Rust for performance and safety
  • Uses quick-xml for fast XML parsing
  • Uses clap for command-line argument parsing
  • Proper error handling with anyhow

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Creating Releases

To create a new release:

  1. Update the version in Cargo.toml and src/main.rs
  2. Commit the version changes
  3. Create and push a version tag:
    git tag v1.0.1
    git push origin v1.0.1
    
  4. The GitHub Actions workflow will automatically build binaries for all platforms and create a release

The CI workflow runs on every push to ensure code quality with formatting checks, linting, and tests.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

unxml_rs-1.2.0-py3-none-win_amd64.whl (784.5 kB view details)

Uploaded Python 3Windows x86-64

unxml_rs-1.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (974.4 kB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

unxml_rs-1.2.0-py3-none-macosx_11_0_arm64.whl (883.1 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

unxml_rs-1.2.0-py3-none-macosx_10_12_x86_64.whl (902.4 kB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file unxml_rs-1.2.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: unxml_rs-1.2.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 784.5 kB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for unxml_rs-1.2.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 feaceaeecfdd0bd4b0f0f566fd8d648f709eb156a53267f9bc85bcd5f0b00bfc
MD5 532c8514bf4c2cebad9009f9acc2b23d
BLAKE2b-256 73a6cc8b48909325cdf6db60c02466b8c13bbb8dc1fd7f9f0cd8f9b42919c5d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.2.0-py3-none-win_amd64.whl:

Publisher: release.yml on vivainio/unxml-rs

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

File details

Details for the file unxml_rs-1.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2ae0145dcd32b8327f5f077b0ab7d5ffcc7a20d891464c4bb614eaa5f1a83fab
MD5 86540f92d17092f8a0aaa3945175e9d0
BLAKE2b-256 8ea109d026ffb6aaad66a0eff34a12203eb5b942685a62d22897a20d71351f18

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on vivainio/unxml-rs

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

File details

Details for the file unxml_rs-1.2.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.2.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d00062571fddc5b6c7f940845425b4770838ce3cd126b471b1fc476a5815e5ad
MD5 13de8a6d24cd112da7a8c05b2c40475b
BLAKE2b-256 b721d0bcad0a8a2f21f8600fade6efab9514c64d0853d95b03bf11ffa46c7c41

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.2.0-py3-none-macosx_11_0_arm64.whl:

Publisher: release.yml on vivainio/unxml-rs

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

File details

Details for the file unxml_rs-1.2.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.2.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f8b40b9a12939e07a67ca1311bf9b6fc0c2a0e09e7d2f1a4582665f285443836
MD5 7846ec41d54884d22a853dadd3521626
BLAKE2b-256 32833967cfc1d233a5021b24998a6eec6b89b2c47043ec521ba0b4ea9b9634be

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.2.0-py3-none-macosx_10_12_x86_64.whl:

Publisher: release.yml on vivainio/unxml-rs

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