Le Jeudi 3 Novembre 2005 14:45, Robin Berjon a écrit :
>
> Il faut bien distinguer l'objet DOM de sa sérialisation XML. L'objet
> importé a bel et bien le bon namespace, ainsi qu'un préfixe
> correspondant et tout ce qu'il faut (pareil pour ses attributs et
> descendants quand l'option deep est à true). Par contre ton
> implémentation DOM peut ne pas rendre celà évident si tu fais un
> toString sur un élément isolé, et peut parfois se tromper dans sa
> sérialisation du document en entier. Dans ce dernier cas c'est un bug
> (ou une limitation) de l'implémentation, et non pas de la spec.
Effectivement, j'ai fait un petit programme utilitaire pour tester tout ça, et
j'ai pu constater que l'espace de nom est bien le bon dans le document
résultat, mais c'est la sérialization qui ne le rend pas correctement.
Je fais la sérialization par une transformation xslt identité, avec le java
1.4 ; donc ce serait là le bug.
Bon ! Et... connaissez-vous un workeround de façon à ce que la sérialization
me sérialize le document xml correctement ???
Pour info, voici mon horrible utilitaire, qui, à partir de
"<a xmlns:voir=\"http://voir\"><voir:z/></a>"
affiche
<?xml version="1.0" encoding="UTF-8"?>
<voir:z/>
getTagName=voir:z
LocalName=z
getNamespaceURI=http://voir
... ce qui montre bien qu'on à bien le namespace dans le dom importé, mais pas
dans la sérialization.
import org.w3c.dom.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.parsers.*;
import java.io.*;
import org.xml.sax.*;
public class Importnode
{
public static void main(String args[]) throws Exception
{
DocumentBuilderFactory dbf;
DocumentBuilder db;
Document domori;
Document domdest;
Node nodeVoirZ;
TransformerFactory tf;
Transformer t;
StreamResult sr;
DOMSource doms;
StringWriter sw;
String txt;
Element racinedest;
dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
db = dbf.newDocumentBuilder();
// création du document source
domori = db.parse(new InputSource(new StringReader(
"<a xmlns:voir=\"http://voir\"><voir:z/></a>"
)));
nodeVoirZ = domori.getDocumentElement().getFirstChild();
// création du document destination et import
domdest = db.newDocument();
domdest.appendChild(domdest.importNode(nodeVoirZ, true));
// serialization du document destination
tf = TransformerFactory.newInstance();
t = tf.newTransformer();
doms = new DOMSource(domdest);
sw = new StringWriter();
sr = new StreamResult(sw);
t.transform(doms, sr);
txt = sw.toString();
System.out.println(txt);
// affichage des caracteristiques du document destination :
racinedest = domdest.getDocumentElement();
System.out.println("getTagName="+racinedest.getTagName());
System.out.println("LocalName="+racinedest.getLocalName());
System.out.println("getNamespaceURI="+racinedest.getNamespaceURI());
}
}
--
SARL diaam informatique - 04 77 25 43 28
Ingenierie, développements de systèmes d'information
http://www.diaam-informatique.com
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Received on Thu Nov 3 18:32:13 2005