Rust crate for the EML_NL standard https://crates.io/crates/eml-nl
Find a file
dependabot[bot] 7947b4d317
Bump the github-actions group across 1 directory with 4 updates (#37)
Bumps the github-actions group with 4 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [taiki-e/install-action](https://github.com/taiki-e/install-action), [codecov/codecov-action](https://github.com/codecov/codecov-action) and [rust-lang/crates-io-auth-action](https://github.com/rust-lang/crates-io-auth-action).


Updates `actions/checkout` from 6.0.3 to 7.0.0
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](df4cb1c069...9c091bb21b)

Updates `taiki-e/install-action` from 2.81.3 to 2.82.0
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](25435dc8dd...b8cecb8356)

Updates `codecov/codecov-action` from 6.0.1 to 7.0.0
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](e79a6962e0...fb8b3582c8)

Updates `rust-lang/crates-io-auth-action` from 1.0.4 to 1.0.5
- [Release notes](https://github.com/rust-lang/crates-io-auth-action/releases)
- [Commits](bbd81622f2...c6f97d4224)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: taiki-e/install-action
  dependency-version: 2.82.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
- dependency-name: codecov/codecov-action
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: rust-lang/crates-io-auth-action
  dependency-version: 1.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-06-23 09:44:22 +00:00
.config Add junit output to nextest 2025-12-26 21:29:19 +01:00
.github Bump the github-actions group across 1 directory with 4 updates (#37) 2026-06-23 09:44:22 +00:00
bin Implement CSB/GSB CSV exporting usable from the library (#26) 2026-06-02 09:43:15 +00:00
eml-nl@ee0a64e92c Implementation of 230b candidate lists 2026-01-29 00:17:43 +01:00
src Fixes for quick-xml 0.40 (#30) 2026-06-08 11:43:10 +00:00
test-files Implement CSB/GSB CSV exporting usable from the library (#26) 2026-06-02 09:43:15 +00:00
.gitattributes Implement CSB/GSB CSV exporting usable from the library (#26) 2026-06-02 09:43:15 +00:00
.gitignore Commit lockfile, prepare 0.6 release (#28) 2026-06-02 14:08:32 +00:00
.gitmodules Initial commit 2025-12-15 16:44:54 +01:00
Cargo.lock Fixes for quick-xml 0.40 (#30) 2026-06-08 11:43:10 +00:00
Cargo.toml Fixes for quick-xml 0.40 (#30) 2026-06-08 11:43:10 +00:00
LICENSE Initial commit 2025-12-15 16:44:54 +01:00
README.md Add reference to existing data sources for EML_NL files (#15) 2026-05-15 12:33:09 +00:00
SECURITY.md Update some documentation 2026-02-06 16:33:22 +01:00

Kiesraad EML_NL Reader/Writer

This is a Rust crate that parses/emits EML_NL XML documents. Within this repository we sometimes interchangeably use EML and EML_NL, but the software only supports the EML_NL specification.

Multiple versions of the EML_NL specification exist. For more details on the specification you can visit the Kiesraad website. For the schema definitions you can also visit the EML_NL repository on GitHub. The version of EML_NL that the current code supports is always linked as a git submodule on this repository as well. This current branch is aiming to support EML_NL versions 1.2.1 and 1.2.2.

This library requires the entire EML_NL file to be available in memory at once and does not support streaming while reading or writing the document. The memory overhead of a parsed document is relatively low however. It is able to parse the entire GR2022 election definitions, candidate lists, counts and results of all municipalties that participated at that time in approximately 5 seconds (a little under 500MB of XML data) on a small laptop. The library should be functional on virtually any supported Rust target (including most desktop and mobile OSes and the web).

Library usage

For information on how to use this library please reference the generated rust docs. For the newest released version you can check these on docs.rs.

Existing EML_NL data

The Kiesraad releases EML_NL documents for each election. To find these, you can visit data.overheid.nl and go to the Kiesraad organization page. Once you find the election you are interested in, you can download the EML_NL documents from the 'Databronnen' page (look for EML in the title of the data source).

Utilities

Aside from the library this repository also includes some helpful tools that use the library to offer separate functionality. These tools are described below.

EML Validator

The EML validator is a validator for EML_NL documents. It will output any warnings and errors that are contained within a document. If you have a document with known issues that don't get reported, or if you found an EML_NL file that incorrectly emits a warning or error, please report an issue. The validator will also emit the size of a document and its hash. You can also print an internal representation of the document using the --debug flag and print an emitted pretty printed document by using the --print flag. For more information about the capabilities of the validator you can run --help.

eml2csv

This is a direct conversion of the eml2csv tool. This tool can be used to transform the combination of an EML-230b candidate list and EML-510b municipal count document to generate a CSV file in 'osv4-3' format. The input of this tool is a little more flexible, you may provide the required files in any order you want. You also have a couple of options to customize the output format for when you are not working with Excel (omitting the UTF-8 BOM and including a final newline).