Logstash filtre XML, tableaux avec Xpath


(Thomas Choquet) #1

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


(system) #2