...

Source file src/github.com/clbanning/mxj/v2/examples/gonuts5.go

Documentation: github.com/clbanning/mxj/v2/examples

     1  // gonuts5.go - from https://groups.google.com/forum/#!topic/golang-nuts/MWoYY19of3o
     2  // problem is to extract entries from <lst name="list3-1-1-1"></lst> by "int name="
     3  
     4  package main
     5  
     6  import (
     7  	"fmt"
     8  	"github.com/clbanning/mxj"
     9  )
    10  
    11  var xmlData = []byte(`<?xml version="1.0" encoding="UTF-8"?>
    12  <response>
    13  	<lst name="list1">
    14  	</lst>
    15  	<lst name="list2">
    16  	</lst>
    17  	<lst name="list3">
    18  		<int name="docId">1</int>
    19  		<lst name="list3-1">
    20  			<lst name="list3-1-1">
    21  				<lst name="list3-1-1-1">
    22  					<int name="field1">1</int>
    23  					<int name="field2">2</int>
    24  					<int name="field3">3</int>
    25  					<int name="field4">4</int>
    26  					<int name="field5">5</int>
    27  				</lst>
    28  			</lst>
    29  			<lst name="list3-1-2">
    30  				<lst name="list3-1-2-1">
    31  					<int name="field1">1</int>
    32  					<int name="field2">2</int>
    33  					<int name="field3">3</int>
    34  					<int name="field4">4</int>
    35  					<int name="field5">5</int>
    36  				</lst>
    37  			</lst>
    38  		</lst>
    39  	</lst>
    40  </response>`)
    41  
    42  func main() {
    43  	// parse XML into a Map
    44  	m, merr := mxj.NewMapXml(xmlData)
    45  	if merr != nil {
    46  		fmt.Println("merr:", merr.Error())
    47  		return
    48  	}
    49  
    50  	// extract the 'list3-1-1-1' node - there'll be just 1?
    51  	// NOTE: attribute keys are prepended with '-'
    52  	lstVal, lerr := m.ValuesForPath("*.*.*.*.*", "-name:list3-1-1-1")
    53  	if lerr != nil {
    54  		fmt.Println("ierr:", lerr.Error())
    55  		return
    56  	}
    57  
    58  	// assuming just one value returned - create a new Map
    59  	mv := mxj.Map(lstVal[0].(map[string]interface{}))
    60  
    61  	// extract the 'int' values by 'name' attribute: "-name"
    62  	// interate over list of 'name' values of interest
    63  	var names = []string{"field1", "field2", "field3", "field4", "field5"}
    64  	for _, n := range names {
    65  		vals, verr := mv.ValuesForKey("int", "-name:"+n)
    66  		if verr != nil {
    67  			fmt.Println("verr:", verr.Error(), len(vals))
    68  			return
    69  		}
    70  
    71  		// values for simple elements have key '#text'
    72  		// NOTE: there can be only one value for key '#text'
    73  		fmt.Println(n, ":", vals[0].(map[string]interface{})["#text"])
    74  	}
    75  }
    76  

View as plain text