Skip to main content

Universal File Editor for XML/SVG/HTML with XPath and CSS selector support

Project description

xsl - Universal File Editor

PyPI version Python Support License: MIT Tests

๐Ÿ› ๏ธ Powerful CLI tool and Python library for editing XML, SVG, and HTML files using XPath and CSS selectors.

โœจ Features

  • ๐Ÿ” XPath & CSS Selectors - Precise element targeting and querying
  • ๐Ÿ“ Multiple Formats - Full support for XML, SVG, and HTML documents
  • ๐ŸŒ Local & Remote Files - Edit files locally or fetch from URLs
  • ๐Ÿ“ฆ Data URI Extraction - Extract and decode embedded content (PDFs, images, documents)
  • โšก Multiple Interfaces - CLI commands, interactive shell, and HTTP server
  • ๐Ÿ–ฅ๏ธ Web Interface - Modern browser-based editor with real-time API
  • ๐Ÿ Python API - Full programmatic access for automation and integration
  • ๐Ÿ”ง Extensible - Plugin architecture for custom file processors

๐Ÿš€ Quick Start

Installation

# Basic installation
pip install xsl

# Full installation with all features  
pip install xsl[full]

# Specific feature sets
pip install xsl[xpath]     # XPath support only
pip install xsl[css]       # CSS selectors only  
pip install xsl[remote]    # Remote file support only
pip install xsl[server]    # HTTP server support only

CLI Usage

# Load and query files
xsl load example.svg
xsl query "//svg:text[@id='title']"
xsl set "//svg:text[@id='title']" "New Title"

# Extract embedded data
xsl extract "//svg:image/@xlink:href" --output document.pdf
xsl extract "//svg:image/@xlink:href" --info

# Interactive shell
xsl shell

# HTTP Server
xsl server --port 8082

Python API

from xsl import FileEditor

# Load and edit file
editor = FileEditor('example.svg')
editor.set_element_text("//svg:text[@id='title']", "New Title")
editor.save('modified.svg')

# Extract Data URI
result = editor.extract_data_uri("//svg:image/@xlink:href")
if 'error' not in result:
    print(f"Found {result['mime_type']} ({result['size']} bytes)")

# Work with remote files
remote_editor = FileEditor('https://example.com/diagram.svg')
elements = remote_editor.list_elements("//svg:*[@id]")

๐Ÿ“– Documentation

๐ŸŽฏ Use Cases

๐Ÿ“Š Extract Data from SVG Diagrams

# Extract embedded PDF from technical diagram
xsl extract "//svg:image/@xlink:href" --output manual.pdf

# Get chart data from SVG
xsl query "//svg:foreignObject//script[@type='application/json']"

๐Ÿ”ง Batch Update XML Configurations

# Update database connections across config files
for config in configs/*.xml; do
  xsl set "//database/host" "new-server.com" "$config"
  xsl save "$config"
done

๐ŸŒ Parse Web Pages for Data

# Extract structured data from HTML
xsl query "//table[@id='data']//tr[@data-status='active']" page.html
xsl extract "//script[@type='application/json']" --output data.json

๐Ÿ”„ Document Format Conversion

# Convert XML structure using XPath
from xsl import FileEditor

source = FileEditor('legacy.xml')
data = source.list_elements("//record")

target = FileEditor('template.xml')
for item in data:
    target.add_element("//records", "entry", item['text'], item['attributes'])
target.save('migrated.xml')

๐Ÿ” XPath Examples

SVG Files

# Get all text elements
//svg:text

# Find elements by ID
//svg:*[@id='title']

# Extract Data URIs
//svg:image/@xlink:href[starts-with(., 'data:')]

# Get metadata
//svg:metadata

XML Files

# Find by attribute
//user[@type='admin']

# Text content search
//*[contains(text(), 'error')]

# Nested elements
//config//database//host

HTML Files

# CSS class targeting
//div[@class='content']

# Form elements
//input[@type='checkbox'][@checked]

# JSON script tags
//script[@type='application/json']

๐ŸŒ HTTP Server API

Start the server:

xsl server --port 8082

Direct Data URI Extraction

# Extract from remote file
curl "http://localhost:8082/api/extract?url=https://example.com/diagram.svg&xpath=//svg:image/@href"

Full API Workflow

# Load file
curl -X POST http://localhost:8082/api/load \
  -H "Content-Type: application/json" \
  -d '{"file_path": "example.svg"}'

# Query elements  
curl -X POST http://localhost:8082/api/query \
  -H "Content-Type: application/json" \
  -d '{"query": "//svg:text", "type": "xpath"}'

# Update content
curl -X POST http://localhost:8082/api/update \
  -H "Content-Type: application/json" \
  -d '{"xpath": "//svg:text[@id=\"title\"]", "type": "text", "value": "Updated"}'

# Save changes
curl -X POST http://localhost:8082/api/save \
  -H "Content-Type: application/json" \
  -d '{"output_path": "modified.svg"}'

Web Interface

Open http://localhost:8082 in your browser for a full-featured web interface with:

  • ๐Ÿ“ File Management - Load local files or remote URLs
  • ๐Ÿ” Interactive Queries - Test XPath and CSS selectors with real-time results
  • โœ๏ธ Visual Editing - Modify elements through web forms
  • ๐Ÿ“ฆ Data Extraction - Extract and download embedded resources
  • ๐Ÿ“Š Element Browser - Navigate document structure visually

๐Ÿงช Examples and Testing

Generate example files:

xsl examples --dir ./test_files

This creates:

  • example.svg - SVG with embedded Data URIs and metadata
  • example.xml - XML database with users and file data
  • example.html - HTML with embedded SVG and JSON
  • USAGE_EXAMPLES.md - Comprehensive usage guide

โš™๏ธ Configuration

Optional Dependencies

xsl works with basic XML support out of the box, but optional dependencies unlock additional features:

  • lxml - Required for XPath queries and advanced XML processing
  • beautifulsoup4 - Enables CSS selectors for HTML files
  • requests - Allows loading files from remote URLs

Install all features:

pip install xsl[full]

Environment Variables

# Default server settings
export xsl_DEFAULT_PORT=8082
export xsl_DEFAULT_HOST=localhost

# Debug mode
export xsl_DEBUG=1

๐Ÿ”ง Development

Setup Development Environment

git clone https://github.com/veridock/xsl.git
cd xsl

# Install Poetry
curl -sSL https://install.python-poetry.org | python3 -

# Install dependencies
poetry install --extras "full"

# Run tests
poetry run pytest

# Format code
poetry run black xsl/
poetry run isort xsl/

Running Tests

# All tests
poetry run pytest

# With coverage
poetry run pytest --cov=xsl --cov-report=html

# Specific test categories
poetry run pytest -m "not slow"  # Skip slow tests
poetry run pytest -m "integration"  # Only integration tests

Code Quality

# Format and lint
poetry run black xsl/ tests/
poetry run isort xsl/ tests/
poetry run flake8 xsl/ tests/
poetry run mypy xsl/

๐Ÿค Contributing

We welcome contributions! Please see our Contributing Guide for details.

Quick Contribution Workflow

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes and add tests
  4. Run tests: poetry run pytest
  5. Format code: poetry run black xsl/
  6. Commit: git commit -m 'Add amazing feature'
  7. Push: git push origin feature/amazing-feature
  8. Open a Pull Request

๐Ÿ“‹ Requirements

  • Python 3.8+
  • Optional: lxml, beautifulsoup4, requests (install with [full] extra)

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

๐Ÿ™ Acknowledgments

  • Built with lxml for robust XML processing
  • Uses Beautiful Soup for HTML parsing
  • Powered by Poetry for dependency management

๐Ÿ“ž Support


Made with โค๏ธ by the xsl team

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

xsl-0.1.8.tar.gz (21.5 kB view details)

Uploaded Source

Built Distribution

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

xsl-0.1.8-py3-none-any.whl (20.9 kB view details)

Uploaded Python 3

File details

Details for the file xsl-0.1.8.tar.gz.

File metadata

  • Download URL: xsl-0.1.8.tar.gz
  • Upload date:
  • Size: 21.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.12 Linux/6.15.3-200.fc42.x86_64

File hashes

Hashes for xsl-0.1.8.tar.gz
Algorithm Hash digest
SHA256 30e58420e11e287c5939af3a70fed84fca68cb73fb7ac9d68ad0d8a68988c438
MD5 f9cc3af46f06a901da033a415476c84e
BLAKE2b-256 c32d60e8f6de69dbacb692d3aee14bcd379b71f3192fef44be86c3424bd0baca

See more details on using hashes here.

File details

Details for the file xsl-0.1.8-py3-none-any.whl.

File metadata

  • Download URL: xsl-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 20.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.3 CPython/3.11.12 Linux/6.15.3-200.fc42.x86_64

File hashes

Hashes for xsl-0.1.8-py3-none-any.whl
Algorithm Hash digest
SHA256 47585cb0da2f7464e8a4df670288a1ec3990839fe0c1a70419b2c73359302e32
MD5 0431c05a6bf52e62f1c59884b1a65188
BLAKE2b-256 5e578c2bc42cf80b4d9de624aec3b6cdb7e3a2a3205ae91a5035e95e126f0a3d

See more details on using hashes here.

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