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.

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.

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.1.0-py3-none-win_amd64.whl (780.5 kB view details)

Uploaded Python 3Windows x86-64

unxml_rs-1.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (971.1 kB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

unxml_rs-1.1.0-py3-none-macosx_11_0_arm64.whl (877.6 kB view details)

Uploaded Python 3macOS 11.0+ ARM64

unxml_rs-1.1.0-py3-none-macosx_10_12_x86_64.whl (896.9 kB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: unxml_rs-1.1.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 780.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.1.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 4bc57ed96a7e804351eff2de6a1cb1639e483fa139025eeaa03e1e5ba293488d
MD5 c79611566add448142cfced71ee892d3
BLAKE2b-256 4fc4c0b24e229a31a03e4acf4911ec616edb69f66b4e27eb8c98a5c5437af1fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.1.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.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2a756935078e1788e9f108a4288c3ba193d04c87cf717d70af9b7b0a9afcd53f
MD5 53bba369011424c5e703195663919bf8
BLAKE2b-256 95ee3fc6dbabe0fec68abed5f4f20cd921fc6ee4b1e4eaf97b74affa98f6f56d

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.1.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.1.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.1.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f9a5d1dbfe6debbb499cb8ccf7d8b0d9071b4ad56b4d8ee3569eac910e70bc13
MD5 f85a695ac2a0916c30ce187285ecaeff
BLAKE2b-256 afc4eb9d62dbc368412182145d4c15adb0ec8954fb0db615d89e5e58ff01a862

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.1.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.1.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for unxml_rs-1.1.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ef2b56c32742707659502afd80559fa7169be48400729538efac28b022472cac
MD5 3da44a82ecab7835c67f2cfea7b42b9d
BLAKE2b-256 cce75a6f8420da09e69aac69bc621265a59b0f6e58581e8c4c0e0405ab60f18b

See more details on using hashes here.

Provenance

The following attestation bundles were made for unxml_rs-1.1.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