Ajout de noeud dans saxon via XPATH + API Saxon HE 9.3 ne fonctionne pas
7 réponses
ALaRechercheDuTempsPerdu
Bonjour,
J'execute une requ=EAte XPATH pour selectionner un noeud depuis un
document source
Modifier certains attributs via mon appli java
Injecter le noeud r=E9sultant dans un doc XML cible.
Je pr=E9cise que je n'utilise pas XSLT sciemment :)
Mon probl=E8me est le suivant : au moment de s=E9rialiser mon nouveau
document, le document enregsitr=E9 est identique =E0 l'ancien, comme si
l'appel =E0 Append n'avait rien fait.
Mon problème est le suivant : au moment de sérialiser mon nouveau document, le document enregsitré est identique à l'ancien, comme si l'appel à Append n'avait rien fait.
Je ne connais pas la bibliothèque mais quelques remarques, sait-on jamais...
Pourquoi récupérer un élément ? Est-ce qu'il ne faut pas sauver la racine ? Quel est cet élément à l'emplacement 0 ? Est-ce la bonne racine ? Est-ce que l'élément ajouté ne se trouve pas à côté (à l'emplacement 1) ?
Voilà, en espérant qu'un peu de trace permette de résoudre le problème :) .
Bonjour
Mon problème est le suivant : au moment de sérialiser mon nouveau
document, le document enregsitré est identique à l'ancien, comme si
l'appel à Append n'avait rien fait.
Je ne connais pas la bibliothèque mais quelques remarques, sait-on
jamais...
Pourquoi récupérer un élément ? Est-ce qu'il ne faut pas sauver la
racine ? Quel est cet élément à l'emplacement 0 ? Est-ce la bonne
racine ? Est-ce que l'élément ajouté ne se trouve pas à côté (à
l'emplacement 1) ?
Mon problème est le suivant : au moment de sérialiser mon nouveau document, le document enregsitré est identique à l'ancien, comme si l'appel à Append n'avait rien fait.
Je ne connais pas la bibliothèque mais quelques remarques, sait-on jamais...
Pourquoi récupérer un élément ? Est-ce qu'il ne faut pas sauver la racine ? Quel est cet élément à l'emplacement 0 ? Est-ce la bonne racine ? Est-ce que l'élément ajouté ne se trouve pas à côté (à l'emplacement 1) ?
J'ai continué à chercher :) Pour la remarque sur le fait que je me retrouve avec 2 éléments racine, ce qui est invalide, c'est tout à fait exact !
Du coup, j'ai changé mon fusil d'épaule :
1 Chargement d'un DOM Source classique 2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath 3 Injection du noeud récupéré dans mon DomSource d'origine après modification du noeud. 4 Sauvegarde du nouveau domsource (celui de départ + le noeuf modifié).
Je bloque sur le 3 : Comment transformer mon XdmValue en Node pour pouvoir faire le appendChild ?
// Append node to source. //String msg = String.format("Collection size before : %d", source.size()); //logger.info(msg);
// C'est la suite qui bloque, au moment d'injecter le résultat de la requête, j'arrive pas à trouver le chemin pour caster :( NodeInfo ni = child.getUnderlyingNode();
domRoot.adoptNode(ni);
Merci pour votre aide en tout cas !
Bonjour,
J'ai continué à chercher :)
Pour la remarque sur le fait que je me retrouve avec 2 éléments
racine, ce qui est invalide, c'est tout à fait exact !
Du coup, j'ai changé mon fusil d'épaule :
1 Chargement d'un DOM Source classique
2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath
3 Injection du noeud récupéré dans mon DomSource d'origine après
modification du noeud.
4 Sauvegarde du nouveau domsource (celui de départ + le noeuf
modifié).
Je bloque sur le 3 :
Comment transformer mon XdmValue en Node pour pouvoir faire le
appendChild ?
// Append node to source.
//String msg = String.format("Collection size before : %d",
source.size());
//logger.info(msg);
// C'est la suite qui bloque, au moment d'injecter le résultat de la
requête, j'arrive pas à trouver le chemin pour caster :(
NodeInfo ni = child.getUnderlyingNode();
J'ai continué à chercher :) Pour la remarque sur le fait que je me retrouve avec 2 éléments racine, ce qui est invalide, c'est tout à fait exact !
Du coup, j'ai changé mon fusil d'épaule :
1 Chargement d'un DOM Source classique 2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath 3 Injection du noeud récupéré dans mon DomSource d'origine après modification du noeud. 4 Sauvegarde du nouveau domsource (celui de départ + le noeuf modifié).
Je bloque sur le 3 : Comment transformer mon XdmValue en Node pour pouvoir faire le appendChild ?
// Append node to source. //String msg = String.format("Collection size before : %d", source.size()); //logger.info(msg);
// C'est la suite qui bloque, au moment d'injecter le résultat de la requête, j'arrive pas à trouver le chemin pour caster :( NodeInfo ni = child.getUnderlyingNode();
ALaRechercheDuTempsPerdu writes: > 1 Chargement d'un DOM Source classique > 2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath > 3 Injection du noeud récupéré dans mon DomSource d'origine aprè s > modification du noeud.
Tu n'as toujours pas dit à quel endroit tu voulais insérer le noeud. D'autre part, le même noeud ne peut pas apparaître deux fois dans un arbre (par définition) : il faudra donc le cloner, puis insérer son clone.
> 4 Sauvegarde du nouveau domsource (celui de départ + le noeuf > modifié).
> Je bloque sur le 3 : > Comment transformer mon XdmValue en Node pour pouvoir faire le > appendChild ?
Il n'y a aucune raison que ce soit possible. Après :
>XdmNodesaxonDocument = saxonBuilder.build(s);
il n'est pas sûr que les nodes saxon fassent encore référence aux n odes DOM. Il vaudrait mieux choisir l'un ou l'autre.
-- Alain.
Ah exact, je vais l'inserer dans un des enfants du dom, pour cela, je comptais faire un getChild sur le modèle DOM. Pour le point du clone, en réalité, le noeud copié provient d'un autr e document source sur lequel j'ai fait une requete XPath.
Pour utiliser le saxon builder c'est bonne idée, j'ai juste un pb pour faire l'append sur le child correct. Peut-être que je devrai faire une requête xpath pour déterminer le point d'insertion et faire l'append dessus: j'obtiens alors e2.
Mais j'aurai tjs le même pb: comment rattacher le nouvel element e2 dans le document saxon :(
On 15 juin, 15:45, Alain Ketterlin <al...@dpt-info.u-strasbg.fr>
wrote:
ALaRechercheDuTempsPerdu <webautosubscripti...@gmail.com> writes:
> 1 Chargement d'un DOM Source classique
> 2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath
> 3 Injection du noeud récupéré dans mon DomSource d'origine aprè s
> modification du noeud.
Tu n'as toujours pas dit à quel endroit tu voulais insérer le noeud.
D'autre part, le même noeud ne peut pas apparaître deux fois dans un
arbre (par définition) : il faudra donc le cloner, puis insérer son
clone.
> 4 Sauvegarde du nouveau domsource (celui de départ + le noeuf
> modifié).
> Je bloque sur le 3 :
> Comment transformer mon XdmValue en Node pour pouvoir faire le
> appendChild ?
Il n'y a aucune raison que ce soit possible. Après :
>XdmNodesaxonDocument = saxonBuilder.build(s);
il n'est pas sûr que les nodes saxon fassent encore référence aux n odes
DOM. Il vaudrait mieux choisir l'un ou l'autre.
-- Alain.
Ah exact, je vais l'inserer dans un des enfants du dom, pour cela, je
comptais faire un getChild sur le modèle DOM.
Pour le point du clone, en réalité, le noeud copié provient d'un autr e
document source sur lequel j'ai fait une requete XPath.
Pour utiliser le saxon builder c'est bonne idée, j'ai juste un pb pour
faire l'append sur le child correct.
Peut-être que je devrai faire une requête xpath pour déterminer le
point d'insertion et faire l'append dessus: j'obtiens alors e2.
Mais j'aurai tjs le même pb: comment rattacher le nouvel element e2
dans le document saxon :(
ALaRechercheDuTempsPerdu writes: > 1 Chargement d'un DOM Source classique > 2 Wrap dans un Saxon XdmItem du DomSourcepour faire la requete XPath > 3 Injection du noeud récupéré dans mon DomSource d'origine aprè s > modification du noeud.
Tu n'as toujours pas dit à quel endroit tu voulais insérer le noeud. D'autre part, le même noeud ne peut pas apparaître deux fois dans un arbre (par définition) : il faudra donc le cloner, puis insérer son clone.
> 4 Sauvegarde du nouveau domsource (celui de départ + le noeuf > modifié).
> Je bloque sur le 3 : > Comment transformer mon XdmValue en Node pour pouvoir faire le > appendChild ?
Il n'y a aucune raison que ce soit possible. Après :
>XdmNodesaxonDocument = saxonBuilder.build(s);
il n'est pas sûr que les nodes saxon fassent encore référence aux n odes DOM. Il vaudrait mieux choisir l'un ou l'autre.
-- Alain.
Ah exact, je vais l'inserer dans un des enfants du dom, pour cela, je comptais faire un getChild sur le modèle DOM. Pour le point du clone, en réalité, le noeud copié provient d'un autr e document source sur lequel j'ai fait une requete XPath.
Pour utiliser le saxon builder c'est bonne idée, j'ai juste un pb pour faire l'append sur le child correct. Peut-être que je devrai faire une requête xpath pour déterminer le point d'insertion et faire l'append dessus: j'obtiens alors e2.
Mais j'aurai tjs le même pb: comment rattacher le nouvel element e2 dans le document saxon :(
ALaRechercheDuTempsPerdu
Bon, après une tentative infructueuse d'utiliser ceci : Processor proc = new Processor(false);
je vais sérialiser mon child en mémoire, construire un nouveau doc xml avec ce child puis l'importer dans mon doc destination. quelle est la classe de output stream pour travailler en mémoire déjà .... hmm javadoc to my rescue :)
Bon, après une tentative infructueuse d'utiliser ceci :
Processor proc = new Processor(false);
je vais sérialiser mon child en mémoire, construire un nouveau doc xml
avec ce child puis l'importer dans mon doc destination.
quelle est la classe de output stream pour travailler en mémoire
déjà .... hmm javadoc to my rescue :)
je vais sérialiser mon child en mémoire, construire un nouveau doc xml avec ce child puis l'importer dans mon doc destination. quelle est la classe de output stream pour travailler en mémoire déjà .... hmm javadoc to my rescue :)