github.com/mundipagg/boleto-api@v0.0.0-20230620145841-3f9ec742599f/parser/parser.go (about) 1 package parser 2 3 import "github.com/beevik/etree" 4 5 //Rule é o tipo de dados que faz o de-para de uma query na mensagem para uma key no dicionário de valores 6 type Rule struct { 7 XMLQuery string 8 MapKey string 9 } 10 11 //TranslatorMap contem as regras de tradução e extração de uma mensagem 12 type TranslatorMap struct { 13 rules []Rule 14 } 15 16 //AddRule adiciona uma regra nova no objeto de tradução 17 func (t *TranslatorMap) AddRule(r Rule) { 18 t.rules = append(t.rules, r) 19 } 20 21 //GetRules retorna todas as regras do tradutor 22 func (t *TranslatorMap) GetRules() []Rule { 23 return t.rules 24 } 25 26 //NewTranslatorMap cria uma novo objeto de tradução 27 func NewTranslatorMap() *TranslatorMap { 28 t := TranslatorMap{} 29 t.rules = make([]Rule, 0, 0) 30 return &t 31 } 32 33 //ParseXML executa o parse do XML e retorna uma estrutura de arvore do documento 34 func ParseXML(xmlDoc string) (*etree.Document, error) { 35 doc := etree.NewDocument() 36 if err := doc.ReadFromString(xmlDoc); err != nil { 37 return etree.NewDocument(), err 38 } 39 return doc, nil 40 } 41 42 //ExtractValuesFromXML extrai os valores do documento de acordo com uma lista de regras de "de-para" 43 func ExtractValuesFromXML(doc *etree.Document, translate *TranslatorMap) map[string]string { 44 values := make(map[string]string) 45 for _, rule := range translate.rules { 46 for _, t := range doc.FindElements(rule.XMLQuery) { 47 values[rule.MapKey] = t.Text() 48 break 49 } 50 } 51 return values 52 } 53 54 // ExtractValues extrai valores de uma string 55 func ExtractValues(xmlDoc string, translator *TranslatorMap) (map[string]string, error) { 56 doc, err := ParseXML(xmlDoc) 57 if err != nil { 58 return nil, err 59 } 60 return ExtractValuesFromXML(doc, translator), nil 61 }