Discussion:
galere xmlns + xpath
(trop ancien pour répondre)
Bernard
2006-11-03 08:17:51 UTC
Permalink
Bonjour

Au lien http://windowssdk.msdn.microsoft.com/en-gb/library/ms757846.aspx, j'ai récupérer les JScript donné en exemple.
Ca marche nickel jusqu'a ce que, dans le fichier xml, je code xmlns="......". (et pas xmlns:boo="...").

Dans ce cas, la ligne
currNode = xmlDoc.selectSingleNode("//book/author");
ne me retourne rien (currNode est Undefine).

Comment faire pour faire fonctionner ce JScript?

D'avance, merci
Bernard
Bernard
2006-11-03 09:19:01 UTC
Permalink
J'ai trouvé. Avec, comme d'hab, un peu de google et beaucoup de patience.
Pour conclure, le JS s'est complexifié:

var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
var currNode;
xmlDoc.async = false;

xmlDoc.load("books.xml");
if (xmlDoc.parseError.errorCode != 0) {
var myErr = xmlDoc.parseError;
WScript.Echo("You have error " + myErr.reason);
} else {
rootname = xmlDoc.documentElement.baseName;
nuri = xmlDoc.documentElement.namespaceURI;
if (nuri != "") {
xmlDoc.setProperty("SelectionNamespaces", "xmlns:xyz='"+nuri+"'");
xname = "xyz:";
} else {
xname = "";
}

xmlDoc.setProperty("SelectionLanguage", "XPath");
currNode = xmlDoc.selectSingleNode("//"+xname+"author");
WScript.Echo(currNode.text);
}
Patrice Manac'h
2006-11-08 08:33:14 UTC
Permalink
Bonjour,

ou faîtes une recherche sur "//localname()='author'"

Cordialement,

P. Manac'h
MCS France
Post by Bernard
J'ai trouvé. Avec, comme d'hab, un peu de google et beaucoup de patience.
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.6.0");
var currNode;
xmlDoc.async = false;
xmlDoc.load("books.xml");
if (xmlDoc.parseError.errorCode != 0) {
var myErr = xmlDoc.parseError;
WScript.Echo("You have error " + myErr.reason);
} else {
rootname = xmlDoc.documentElement.baseName;
nuri = xmlDoc.documentElement.namespaceURI;
if (nuri != "") {
xmlDoc.setProperty("SelectionNamespaces", "xmlns:xyz='"+nuri+"'");
xname = "xyz:";
} else {
xname = "";
}
xmlDoc.setProperty("SelectionLanguage", "XPath");
currNode = xmlDoc.selectSingleNode("//"+xname+"author");
WScript.Echo(currNode.text);
}
erwan amoureux
2006-11-08 14:15:02 UTC
Permalink
Post by Patrice Manac'h
Bonjour,
ou faîtes une recherche sur "//localname()='author'"
Cordialement,
P. Manac'h
MCS France
Il y a quelques erreurs de syntaxe dans ce xpath
local-name etant une fonction elle doit être impérativement utilisé entre
accolade (elle ne peut jamais être simplement précédé d'un /)
une syntaxe plus juste serait de type
"//*[local-name()='author']"
Mais je ne suis pas sur qu'elle soit adapté, en effet je n'ai pas bien
compris les modifications apporté au namespace du fichier originel book.xml
(c'est bien celui-la ?), celui ci n'en possédant pas à l'origine.
Un petit extrait de celui-ci ?
Bernard
2006-11-11 08:20:49 UTC
Permalink
Post by erwan amoureux
Post by Patrice Manac'h
Bonjour,
ou faîtes une recherche sur "//localname()='author'"
Cordialement,
P. Manac'h
MCS France
Il y a quelques erreurs de syntaxe dans ce xpath
local-name etant une fonction elle doit être impérativement utilisé entre
accolade (elle ne peut jamais être simplement précédé d'un /)
une syntaxe plus juste serait de type
"//*[local-name()='author']"
Mais je ne suis pas sur qu'elle soit adapté, en effet je n'ai pas bien
compris les modifications apporté au namespace du fichier originel book.xml
(c'est bien celui-la ?), celui ci n'en possédant pas à l'origine.
Un petit extrait de celui-ci ?
Dans le fichier book.xml original, j'ai ajouté l'attribut xmlns=www.unsite.com au niveau du tag "catalog".

Le but était (est) de comprendre comment réagissait xpath (et/ou xslt et/ou mon script).
J'essaye de gérer des fichiers xml de provenances diverses (plus précisément des fichiers GPX pour mon GPS) issus
d'applications ne respectant pas toujours les principes de xml. Certains de ces fichiers ne sont que "bien formés", sans
espace de nom et/ou sans XSD.

je suis débutant en xml et dans les langages associés. Je n'utilise peut être pas les bons termes et dans ce cas, je
m'excuse par avance.

Bernard
Bernard
2006-11-12 08:04:21 UTC
Permalink
Post by erwan amoureux
Il y a quelques erreurs de syntaxe dans ce xpath
local-name etant une fonction elle doit être impérativement utilisé entre
accolade (elle ne peut jamais être simplement précédé d'un /)
une syntaxe plus juste serait de type
"//*[local-name()='author']"
En tout cas, ca marche, j'ai le résultat escompté.
Merci beaucoup
Bernard
Patrice Manac'h
2006-11-12 11:55:31 UTC
Permalink
Bonjour,

j'avais effectivement tapé un peu vite mais l'idée d'utiliser local-name est
de ne pas être "ennuyé" par les namespaces. cela dit, en terme de
performance, il faut peut être regarder ce que cela donne...

Cdt,

Patrice
Post by Bernard
Post by erwan amoureux
Il y a quelques erreurs de syntaxe dans ce xpath
local-name etant une fonction elle doit être impérativement utilisé entre
accolade (elle ne peut jamais être simplement précédé d'un /)
une syntaxe plus juste serait de type
"//*[local-name()='author']"
En tout cas, ca marche, j'ai le résultat escompté.
Merci beaucoup
Bernard
Bernard
2006-11-14 12:23:04 UTC
Permalink
Post by Patrice Manac'h
Bonjour,
j'avais effectivement tapé un peu vite mais l'idée d'utiliser local-name est de ne pas être "ennuyé" par les
namespaces. cela dit, en terme de performance, il faut peut être regarder ce que cela donne...
Cdt,
Coté perf, ce n'est pas un problème. Mes fichiers faisant quelques Ko, une fraction de seconde en plus ne me gène pas.
De plus, je ne travaille que dans un environnement purement personnel. Je n'ai à gérer que quelques fichiers xml (des
fichiers gpx pour gps).

Encore merci
Bernard

Loading...