// https://groups.google.com/forum/#!topic/golang-nuts/V83jUKluLnM // http://play.golang.org/p/alWGk4MDBc // Here messsages come in one of three forms: // ... list of ClaimStatusCodeRecord ... // ... one instance of ClaimStatusCodeRecord ... // ... empty element ... // ValuesForPath package main import ( "fmt" "github.com/clbanning/mxj" ) var xmlmsg1 = []byte(` true A Initial Claim Review/Screening true B Initial Contact Made w/ Provider `) var xmlmsg2 = []byte(` true A Initial Claim Review/Screening `) var xmlmsg3 = []byte(` `) func main() { xmldata := [][]byte{xmlmsg1, xmlmsg2, xmlmsg3} fullPath(xmldata) partPath1(xmlmsg1) partPath2(xmlmsg1) partPath3(xmlmsg1) partPath4(xmlmsg1) partPath5(xmlmsg1) partPath6(xmlmsg1) } func fullPath(xmldata [][]byte) { for i, msg := range xmldata { fmt.Println("\ndoc:", i) fmt.Println(string(msg)) // decode the XML m, _ := mxj.NewMapXml(msg) // get the value for the key path of interest path := "Envelope.Body.GetClaimStatusCodesResponse.GetClaimStatusCodesResult.ClaimStatusCodeRecord" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") continue } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) fmt.Println("values:", values, "\n") for _, v := range values { switch v.(type) { case map[string]interface{}: fmt.Println("map[string]interface{}:", v.(map[string]interface{})) case []map[string]interface{}: fmt.Println("[]map[string]interface{}:", v.([]map[string]interface{})) case []interface{}: fmt.Println("[]interface{}:", v.([]interface{})) case interface{}: fmt.Println("interface{}:", v.(interface{})) } } } } func partPath1(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "Envelope.Body.*.*.ClaimStatusCodeRecord" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } } func partPath2(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "Envelope.Body.*.*.*" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } } func partPath3(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "*.*.*.*.*" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } } func partPath4(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "*.*.*.*.*.Description" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } } func partPath5(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "*.*.*.*.*.*" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } } func partPath6(msg []byte) { fmt.Println("\nmsg:", string(msg)) m, _ := mxj.NewMapXml(msg) fmt.Println("m:", m.StringIndent()) path := "*.*.*.*.*.*.*" values, err := m.ValuesForPath(path) if err != nil { fmt.Println("err:", err.Error()) return } if values == nil { fmt.Println("path:", path) fmt.Println("No ClaimStatusCodesResult code records.") return } fmt.Println("\nPath:", path) fmt.Println("Number of code records:", len(values)) for n, v := range values { fmt.Printf("\t#%d: %v\n", n, v) } }