Problème de namespace (un nouveau) ou de transformation des < et >
Bon bon, hier avec xandralene on a trouvé des solutions à nos problèmes de namespace (ah ah avec les forums on a l'impression d'avoir le don d'ubiquité).
Seulement ce problème revient sous une autre forme: le body se voit réattribué un namespace lorsqu'il est utilisé dans un fichier XML (pas HTML).
J'ai mon élément BODY avec ses children qui vient d'un HTML.
Maintenant je veux le mettre dans un fichier XML qui contient un tas d'informations + le contenu de BODY.
Donc j'ai le BODY en tant que JDom Element. Il n'a pas de père (méthode detach()). C'est bon.
J'ai le fichier XML suivant (simplifié):
Code:
1 2 3 4 5
|
<content>
<xhtml_fragment>
</xhtml_fragment>
</content> |
Dans xhtml_fragment je dois rajouter l'élement BODY. Et là JDom me remet un namespace!
Mon code:
Code:
1 2
| Element xhtml_fragment = new Element("xhtml_fragment");
xhtml_fragment.addContent(Body); |
Le résultat:
Code:
1 2 3 4 5 6 7
| <xhtml_fragment>
<body xmlns="http://www.w3.org/1999/xhtml">
<table width="100%" border="0" cellspacing="2">
<tr>
<td width="15%" rowspan="1" colspan="1">
<p class="c1"> |
Donc on voit bien que le namespace est rajouté par JDom!!! j'ai vérifié le contenu de body juste avant le addContent grâce au débugger d'eclipse.
Donc ça c'est mon problème. Comment faire pour qu'il ne rajoute pas le namespace?
si je fais body.setNamespace(null) alors jdom me rajoute le namespace sur la table en dessous.
J'ai essayé de trouver une solution de contournement. Par exemple passer le BODY en String. J'ai donc écrit une méthode static docToString (récupérée et adaptée depuis le lien suivant: là).
A toute fins utiles et pour le reuse je vous mets mon code docToString là:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
import org.apache.log4j.Logger;
import org.jdom.Attribute;
import org.jdom.Element;
public class JDomTools {
private static Logger LOGGER = Logger.getLogger(JDomTools.class);
private static String getElement(Element element) {
String Element = "<" + element.getName().toString();
if (element.getAttributes().size()>0) {
for (int m = 0; m < element.getAttributes().size();m++) {
Element += " " + ((Attribute) element.getAttributes().get(m)).getName().toString();
Element += "='" + ((Attribute) element.getAttributes().get(m)).getValue() + "'";
}
}
Element += ">";
if (!(element.getChildren().size()>0)) {
Element += "</" + element.getName().toString() + ">";
}
return Element;
}
private static String getAllElements(Element element) {
String document = "";
if (element.getChildren().size()>0) {
for (int i = 0; i<element.getChildren().size();i++) {
document += getElement((Element) element.getChildren().get(i));
document += getAllElements((Element) element.getChildren().get(i));
if (i == element.getChildren().size()-1) {
document += "</" + element.getName().toString() + ">";
}
}
}
return document;
}
public static String docToString(Element body) {
String newDocument = "";
Element element = body;
newDocument += "<" + element.getName().toString() + ">";
if (element.getAttributes().size()>0) {
for (int i =0; i<element.getAttributes().size(); i++) {
newDocument += ((Attribute) element.getAttributes().get(i)).getName().toString();
}
}
newDocument += getAllElements(element);
LOGGER.debug("BODY to string is: " + newDocument);
return newDocument;
}
} |
Je récupère la bonne String.
Et donc mon code de création du XML final devient:
Code:
1 2 3
| Element xhtml_fragment = new Element("xhtml_fragment");
String sBody = JDomTools.docToString(body);
xhtml_fragment3.setText(sBody); //using the string instead of the element avoid leading to namespace problems. |
Je peux aussi écrire à la place de la dernière ligne:
Code:
xhtml_fragment3.addContent(sBody);
Alors là plus de problème de namespace, mais les < et > sont transformés en < et > ce qui ne va pas car par la suite je réutilise le BODY dans un autre html généré à partir du XML.
Donc cela engendre une autre question (je me demande si je ne devrais pas ouvrir un autre thread pour cette question):
Est-il possible de spécifier aux méthodes addContent(String) ou setText(String) de ne pas transformer les < et > en < et > ????
Merci pour vos réponses.