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.
- 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
- Go 1.20+
- Installed
xmlstarlet
binary available in$PATH
.
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:
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
With Homebrew:
brew install xmlstarlet
Options:
-
Chocolatey
choco install xmlstarlet
-
Scoop
scoop install xmlstarlet
-
Manual
- Download from xmlstar.sourceforge.net
- Extract and add the folder with
xmlstarlet.exe
to your systemPATH
.
go get -u github.com/afansv/go-xmlstarlet-validate@latest
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))
}
}