/xpath-linter

Primary LanguageGoApache License 2.0Apache-2.0

XML-linter

Simple, yet flexible XPath powered XML linter.

This tool implies you are familiar with XPath (XML Path Language)

Modes

  • CI mode designed for Continuous Integration or batch checks - evaluates rules from a configuration file
  • Ad-hoc query - evaluates rules passed by command line flags

Getting started

In CI mode the tool should be used in collaboration with exec option of find utility. For example, if we are going to check all xml in Regression directory against rules in config.yaml:

find ./Regression/ -type f -name "*.xml" -exec ./xpath-linter -ci -cfg ./config.yaml {} \;

In ad-hoc mode, e.g. we are looking for services which do not have generic variables:

find ./Regression/ -type f -name "*.xml" -exec ./xpath-linter -contain //variables {} \;

Linting rules example

config.yaml:

---
rules:
  - name: No variables in settings
    targets: /settings
    must: yes
    contain: //variables

  - name: Username in settings having type=Client is not empty
    having: //type[text()="Client"]
    must: no
    contain: //username[text()]

  - name: No nodes with value > 1
    targets: //node
    must: no
    contain: //node[text()>1]

  - name: Empty tag
    targets: //node
    must: no
    contain: //node[not(text())]

  - name: Tag contains bad word
    must: no
    contain: //tag[contains(text(), "bad word")]

Command line interface

Usage: ./release/xpath-linter [FLAGS] [FILE] 
      --cfg string       File with linting rules (default "config.yaml")
      --ci               Continous integration mode. Evalutates rules from the config against the target file
      --contain string   XPath query to evaluate. Cheatsheet https://devhints.io/xpath (default "/")
      --having string    Optional XPath condition which must be true to proceed with a query. Works like a filter
      --must             Whether target node must have or not 'contain' nodes (default true)
      --targets string   XPath query to find target nodes, default is root node (default "/")
      --version          Show app version

XPath cheatsheet

https://devhints.io/xpath#operators

Build

make