xml2json

package module
v0.0.0-...-2ae9242 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 9, 2022 License: MIT Imports: 8 Imported by: 0

README

goxml2json CircleCI

Go package that converts XML to JSON

Fork
This fork is to help with data sent opensearch, setting empty fields to null rather than "". 
"" is always interpreted as a string, which can create conflicts when the field should be a 
nested object. null is interpreted neutrally for both strings/values and objects, and creates 
no conflicts. 
Install
go get -u github.com/basgys/goxml2json
Importing
import github.com/basgys/goxml2json
Usage

Code example

  package main

  import (
  	"fmt"
  	"strings"

  	xj "github.com/basgys/goxml2json"
  )

  func main() {
  	// xml is an io.Reader
  	xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><hello>world</hello>`)
  	json, err := xj.Convert(xml)
  	if err != nil {
  		panic("That's embarrassing...")
  	}

  	fmt.Println(json.String())
  	// {"hello": "world"}
  }

Input

  <?xml version="1.0" encoding="UTF-8"?>
  <osm version="0.6" generator="CGImap 0.0.2">
   <bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
   <foo>bar</foo>
  </osm>

Output

  {
    "osm": {
      "-version": 0.6,
      "-generator": "CGImap 0.0.2",
      "bounds": {
        "-minlat": "54.0889580",
        "-minlon": "12.2487570",
        "-maxlat": "54.0913900",
        "-maxlon": "12.2524800"
      },
      "foo": "bar"
    }
  }

With type conversion

  package main

  import (
  	"fmt"
  	"strings"

  	xj "github.com/basgys/goxml2json"
  )

  func main() {
  	// xml is an io.Reader
  	xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><price>19.95</price>`)
  	json, err := xj.Convert(xml, xj.WithTypeConverter(xj.Float))
  	if err != nil {
  		panic("That's embarrassing...")
  	}

  	fmt.Println(json.String())
  	// {"price": 19.95}
  }

With empty value setting

  package main

  import (
  	"fmt"
  	"strings"

  	xj "github.com/basgys/goxml2json"
  )

  func main() {
  	// xml is an io.Reader
  	xml := strings.NewReader(`<?xml version="1.0" encoding="UTF-8"?><something></something>`)
  	json, err := xj.Convert(xml, xj.EmptySet("null"))
  	if err != nil {
  		panic("That's embarrassing...")
  	}

  	fmt.Println(json.String())
  	// {"price": null}
  }
Contributing

Feel free to contribute to this project if you want to fix/extend/improve it.

Contributors
TODO
  • Categorise errors
  • Option to prettify the JSON output
  • Benchmark

Documentation

Overview

Package xml2json is an XML to JSON converter

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Convert

func Convert(r io.Reader, ps ...plugin) (*bytes.Buffer, error)

Convert converts the given XML document to JSON

func EmptySet

func EmptySet(val string) *emptyIs

func ExcludeAttributes

func ExcludeAttributes(attrs []string) *excluder

ExcludeAttributes excludes some xml attributes, for example, xmlns:xsi, xsi:noNamespaceSchemaLocation

func NodePlugin

func NodePlugin(path string, plugin nodePlugin) nodeFormatter

func ToArray

func ToArray() *arrayFormatter

func WithAttrPrefix

func WithAttrPrefix(prefix string) *attrPrefixer

WithAttrPrefix appends the given prefix to the json output of xml attribute fields to preserve namespaces

func WithContentPrefix

func WithContentPrefix(prefix string) *contentPrefixer

WithContentPrefix appends the given prefix to the json output of xml content fields to preserve namespaces

func WithNodes

func WithNodes(n ...nodeFormatter) *nodesFormatter

WithNodes formats specific nodes

func WithTypeConverter

func WithTypeConverter(ts ...JSType) *customTypeConverter

WithTypeConverter allows customized js type conversion behavior by passing in the desired JSTypes

Types

type Decoder

type Decoder struct {
	// contains filtered or unexported fields
}

A Decoder reads and decodes XML objects from an input stream.

func NewDecoder

func NewDecoder(r io.Reader, plugins ...plugin) *Decoder

NewDecoder returns a new decoder that reads from r.

func (*Decoder) AddFormatters

func (dec *Decoder) AddFormatters(formatters []nodeFormatter)

func (*Decoder) Decode

func (dec *Decoder) Decode(root *Node) error

Decode reads the next JSON-encoded value from its input and stores it in the value pointed to by v.

func (*Decoder) DecodeWithCustomPrefixes

func (dec *Decoder) DecodeWithCustomPrefixes(root *Node, contentPrefix string, attributePrefix string) error

func (*Decoder) ExcludeAttributes

func (dec *Decoder) ExcludeAttributes(attrs []string)

func (*Decoder) SetAttributePrefix

func (dec *Decoder) SetAttributePrefix(prefix string)

func (*Decoder) SetContentPrefix

func (dec *Decoder) SetContentPrefix(prefix string)

type Encoder

type Encoder struct {
	// contains filtered or unexported fields
}

An Encoder writes JSON objects to an output stream.

func NewEncoder

func NewEncoder(w io.Writer, plugins ...plugin) *Encoder

NewEncoder returns a new encoder that writes to w.

func (*Encoder) Encode

func (enc *Encoder) Encode(root *Node) error

Encode writes the JSON encoding of v to the stream

type JSType

type JSType int

https://cswr.github.io/JsonSchema/spec/basic_types/ JSType is a JavaScript extracted from a string

const (
	Bool JSType = iota
	Int
	Float
	String
	Null
)

func Str2JSType

func Str2JSType(s string) JSType

Str2JSType extract a JavaScript type from a string

type Node

type Node struct {
	Children              map[string]Nodes
	Data                  string
	ChildrenAlwaysAsArray bool
}

Node is a data element on a tree

func (*Node) AddChild

func (n *Node) AddChild(s string, c *Node)

AddChild appends a node to the list of children

func (*Node) GetChild

func (n *Node) GetChild(path string) *Node

GetChild returns child by path if exists. Path looks like "grandparent.parent.child.grandchild"

func (*Node) IsComplex

func (n *Node) IsComplex() bool

IsComplex returns whether it is a complex type (has children)

type Nodes

type Nodes []*Node

Nodes is a list of nodes

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL