Skip to content

afansv/go-xmlstarlet-validate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-xmlstarlet-validate

Go Reference

Go wrapper for xmlstarlet that allows validating XML documents against XSD, DTD, or RelaxNG schemas. The package supports both filename-based and stream-based validation and returns structured errors with precise positions.

Features

  • Validate XML documents against XSD, DTD or RelaxNG
  • Validate by file names or io.Reader streams.
  • Collect structured validation errors
  • Option to stop at the first error

Requirements

  • Go 1.20+
  • Installed xmlstarlet binary available in $PATH.

Installation of xmlstarlet

This package requires the xmlstarlet command-line tool to be available in your $PATH. Check if it is already installed:

xmlstarlet --version

If not, install it depending on your system:

Linux

Most distributions provide it via their package manager:

  • Debian / Ubuntu

    sudo apt-get update
    sudo apt-get install xmlstarlet
  • Fedora

    sudo dnf install xmlstarlet
  • Arch Linux

    sudo pacman -S xmlstarlet
macOS

With Homebrew:

brew install xmlstarlet
Windows

Options:

  1. Chocolatey

    choco install xmlstarlet
  2. Scoop

    scoop install xmlstarlet
  3. Manual

Installation

go get -u github.com/afansv/go-xmlstarlet-validate@latest

Usage

package main

import (
	"fmt"
	"os"
	"strings"

	validate "github.com/afansv/go-xmlstarlet-validate"
)

func main() {
	// Load schema from file
	xsdFile, _ := os.Open("schema.xsd")
	defer xsdFile.Close()

	schema, err := validate.NewSchemaFromReader(xsdFile, validate.SchemaTypeXSD)
	if err != nil {
		panic(err)
	}
	defer schema.Cleanup()

	// Validate XML string
	xml := `<root><invalid/></root>`
	result, err := validate.ValidateFromReader(schema, strings.NewReader(xml), false)
	if err != nil {
		panic(err)
	}

	if result.Valid {
		fmt.Println("Document is valid")
	} else {
		for _, p := range result.Problems {
			fmt.Printf("%s:%d.%d: %s\n", p.Filename, p.Line, p.Col, p.Issue)
		}
	}
	
	// or
	if err := result.Err(); err != nil {
		fmt.Println(fmt.Errorf("validate xml: %w", err))
	}
}

About

Go wrapper for xmlstarlet that allows validating XML documents against XSD, DTD, or RelaxNG schemas

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages