diff --git a/pkg/xixo/callback.go b/pkg/xixo/callback.go index a62fba9..fb08a8f 100644 --- a/pkg/xixo/callback.go +++ b/pkg/xixo/callback.go @@ -25,6 +25,8 @@ func XMLElementToMapCallback(callback CallbackMap) Callback { dict[name] = child[0].InnerText } + extractExistedAttributes(xmlElement, dict) + dict, err := callback(dict) if err != nil { return nil, err @@ -60,6 +62,18 @@ func XMLElementToMapCallback(callback CallbackMap) Callback { return result } +func extractExistedAttributes(xmlElement *XMLElement, dict map[string]string) { + for name, child := range xmlElement.Childs { + for attr, value := range child[0].Attrs { + dict[name+"@"+attr] = value + } + } + + for attr, value := range xmlElement.Attrs { + dict["@"+attr] = value + } +} + // extractChildAttributes extracts child attributes from the dictionary. func extractChildAttributes(dict map[string]string) map[string][]Attribute { childAttributes := make(map[string][]Attribute) diff --git a/pkg/xixo/parser_test.go b/pkg/xixo/parser_test.go index 64d3e1f..46b7e2f 100644 --- a/pkg/xixo/parser_test.go +++ b/pkg/xixo/parser_test.go @@ -193,3 +193,35 @@ func TestModifyAttributsWithMapCallback(t *testing.T) { t.Errorf("Le résultat XML ne correspond pas à l'attendu.\nAttendu:\n%s\nObtenu:\n%s", expectedResultXML, resultXML) } } + +func TestAttributsWithMapCallbackIsInDictionary(t *testing.T) { + t.Parallel() + // Fichier XML en entrée + inputXML := ` + + Hello world! + Contenu2 ! + ` + + // Lisez les résultats du canal et construisez le XML résultant + var resultXMLBuffer bytes.Buffer + + // Créez un bufio.Reader à partir du XML en entrée + reader := bytes.NewBufferString(inputXML) + + // Créez une nouvelle instance du parser XML avec la fonction de rappel + parser := xixo.NewXMLParser(reader, &resultXMLBuffer).EnableXpath() + parser.RegisterMapCallback("root", func(m map[string]string) (map[string]string, error) { + assert.Equal(t, m["@type"], "foo") + assert.Equal(t, m["element1@age"], "22") + assert.Equal(t, m["element1@sex"], "male") + assert.Equal(t, m["element1"], "Hello world!") + assert.Equal(t, m["element2"], "Contenu2 !") + + return m, nil + }) + + // Créez un canal pour collecter les résultats du parser + err := parser.Stream() + assert.Nil(t, err) +}