| Crates.io | ddex-parser |
| lib.rs | ddex-parser |
| version | 0.4.5 |
| created_at | 2025-09-11 15:28:24.261578+00 |
| updated_at | 2025-09-21 23:46:16.946635+00 |
| description | High-performance DDEX XML parser with SIMD optimization (40+ MB/s) |
| homepage | https://github.com/daddykev/ddex-suite |
| repository | https://github.com/daddykev/ddex-suite |
| max_upload_size | |
| id | 1833981 |
| size | 1,335,084 |
High-performance DDEX XML parser built in Rust with comprehensive security protections and command-line interface. Parse ERN 3.8.2, 4.2, and 4.3 files with built-in validation, security hardening against XML attacks, and deterministic JSON output.
Part of the DDEX Suite - a comprehensive toolkit for working with DDEX metadata in the music industry.
v0.4.4 Released - Enhanced validation with strict error handling! Parser now properly fails on missing required fields instead of using placeholders.
v0.4.3 Released - Performance optimizations and enhanced stability.
v0.4.2 Released - Linux x64 Node.js binaries added for cloud deployment compatibility!
Fixed Critical Vulnerabilities:
DDEXParser struct# Install from source
git clone https://github.com/daddykev/ddex-suite
cd ddex-suite/packages/ddex-parser
cargo build --release
# Parse DDEX file to JSON
./target/release/ddex-parser parse release.xml --output release.json
# Validate DDEX file
./target/release/ddex-parser validate release.xml
# Batch process multiple files
./target/release/ddex-parser batch "*.xml" --output-dir results/
use ddex_parser::DDEXParser;
use std::fs::File;
use std::io::BufReader;
// Create parser with secure defaults
let parser = DDEXParser::new();
// Parse DDEX file
let file = File::open("release.xml")?;
let reader = BufReader::new(file);
let parsed = parser.parse(reader)?;
// Access flattened data
println!("Release: {}", parsed.releases[0].release_title[0].text);
println!("Tracks: {}", parsed.releases[0].track_count);
The v0.4.0 release delivers exceptional performance across different workload types:
| Workload Type | Throughput | Use Case |
|---|---|---|
| Production DDEX | 25-30 MB/s | Real-world files with complex structures |
| Batch Processing | 500-700 MB/s | Uniform XML with repetitive patterns |
| Peak Performance | 1,265 MB/s | Optimal conditions, memory efficiency tests |
Real performance measurements from comprehensive test suite:
The SIMD-optimized parser achieves different throughput based on XML structure:
Performance is dramatically different between build modes:
โ ๏ธ Critical: Always build and test in release mode for production:
cargo build --release # 50-100x faster than debug
cargo test --release # Accurate performance measurement
cargo bench --release # Benchmarking
SecurityConfig::relaxed()DDEX Parser extracts data faithfully, while ddex-builder provides smart normalization:
// Parser preserves input exactly as received
const messyVendorDdex = await parser.parse(vendorFile);
// Builder normalizes output to clean DDEX 4.3
const cleanDdex = await builder.build(messyVendorDdex, { normalize: true });
DDEX Parser v0.4.0 performance measurements:
| File Size | Parse Time | Throughput | Elements/sec | Memory |
|---|---|---|---|---|
| 10KB | ~2ms | ~5 MB/s | ~50K/sec | <1MB |
| 100KB | ~8ms | ~12 MB/s | ~70K/sec | <5MB |
| 1MB | ~30ms | ~35 MB/s | ~90K/sec | <20MB |
| 3.6MB | ~80ms | ~45 MB/s | ~100K/sec | <50MB |
| Mode | Performance | Use Case | Memory |
|---|---|---|---|
| Debug | ~0.5 MB/s | Development/Tests | Higher |
| Release | 40+ MB/s | Production | Optimal |
| Component | Optimization | Benefit |
|---|---|---|
| SIMD Pattern | memchr library | 10x faster searching |
| Pre-allocation | 50MB buffers | Zero reallocation |
| Multiple passes | Element-specific | SIMD efficiency |
| Security bounds | Configurable | Memory protection |
v0.4.0 includes comprehensive security enhancements:
const { DdexParser } = require('ddex-parser');
const parser = new DdexParser();
const result = parser.parseSync(xmlContent);
// Full access to parsed data
console.log('Message ID:', result.messageId);
console.log('Releases:', result.releases);
console.log('Resources:', result.resources);
console.log('Deals:', result.deals);
// Access individual release data
result.releases.forEach(release => {
console.log('Release:', release.title);
console.log('Artist:', release.displayArtist);
console.log('Tracks:', release.tracks.length);
});
Seamless integration with ddex-builder for complete workflows with smart normalization:
import { DDEXParser } from 'ddex-parser';
import { DDEXBuilder } from 'ddex-builder';
// Parse existing DDEX file
const parser = new DDEXParser();
const original = await parser.parseFile('input.xml');
// Modify data
const modified = { ...original.flattened };
modified.tracks[0].title = "New Title";
// Build new DDEX file with smart normalization
const builder = new DDEXBuilder();
const newXML = await builder.buildFromFlattened(modified);
// Verify round-trip integrity (with beneficial normalization)
const reparsed = await parser.parseString(newXML);
assert.deepEqual(reparsed.tracks[0].title, "New Title"); // โ
Data integrity preserved
This project is licensed under the MIT License - see the LICENSE file for details.
Built with โค๏ธ for the music industry. Powered by Rust for maximum performance and safety.