Bonjour,
J'ai un fichier XML formaté comme cela :
<EXPORT_CLIENT>
<CLIENT>
<CODE>123456</CODE>
<SEXE>M</SEXE>
<VENTES>
<ENTETES>
<CODECLIENT>123456</CODECLIENT>
<TTC>10</TTC>
<LIGNES>
<DETAIL>
<QTT>42</QTT>
<TTC>13</TTC>
</DETAIL>
<DETAIL>
<QTT>26</QTT>
<TTC>34</TTC>
</DETAIL>
<DETAIL>
...
</DETAIL>
</LIGNES>
</ENTETES>
<ENTETES>
...
</ENTETES>
<ENTETES>
...
</ENTETES>
</VENTES>
</CLIENT>
</EXPORT_CLIENT>
Et j'aimerais que les données soient transformées au format JSON pour être injecté dans ES comme cela :
{
"CODE": "123456",
"SEXE": "M",
"VENTES": [
{
"CODECLIENT": "123456",
"TTC": "10",
"LIGNES": [
{
"QTT": "42",
"TTC": "13"
},
{
"QTT": "26",
"TTC": "34"
}
]
},
{
.....
}
]
}
J'ai configuré un filtre XML sur logstash
input {
stdin {
debug => true
type => default
add_field => [ "xml", "%{@message}" ]
}
}
filter {
xml {
source => "message"
store_xml => false
add_field => [
"VENTES", [],
"VENTES[LIGNES]", []
]
xpath => [
"/CLIENT/CODE/text()","CODE",
"/CLIENT/SEXE/text()","SEXE",
"/CLIENT/VENTES/ENTETES/CODECLIENT/text()","VENTES[CODECLIENT]",
"/CLIENT/VENTES/ENTETES/TTC/text()","VENTES[TTC]",
"/CLIENT/VENTES/ENTETES/LIGNES/DETAIL/QTT/text()","VENTES[LIGNES][QTT]",
"/CLIENT/VENTES/ENTETES/LIGNES/DETAIL/TTC/text()","VENTES[LIGNES][TTC]",
]
}
}
Je n'arrive pas à faire en sorte que VENTES soit un tableau contenant plusieurs ventes, une vente contenant elle-même un attribut LIGNES qui lui aussi est un tableau contenant plusieurs lignes
Voici ce que me retourne logstash actuellement :
{
"CODE" => "123456",
"SEXE" => "M",
"VENTES" => {
"CODECLIENT" => [
[0] "123456",
],
"TTC" => [
[0] "10",
],
"LIGNES" => {
"QTT" => [
[0] "42",
[1] "26",
],
"TTC" => [
[0] "13",
[1] "34",
]
}
}
}
Logstash ne crée pas un tableau par ventes, mais seulement un seul attribut ventes contenant des tableaux pour chaque attributs (ce qui semble logique vu les filtres xpath)
Y a t'il un moyen de créer des tableaux de ventes / lignes avec xpath ?
Instinctivement j'ai essayé une syntaxe comme cela mais ça ne fonctionne pas :
"/CLIENT/VENTES/ENTETES/CODECLIENT/text()","VENTES[][CODECLIENT]",
"/CLIENT/VENTES/ENTETES/TTC/text()","VENTES[][TTC]",
Est-il possible de réussir à faire ce que j'aimerais avec le filtre XML ?
Merci