cartemere | cbeyls a écrit :
Je n'ai pas tout compris... de 1, tu veux que le XML soit indenté c'est ça? et de 2, qu'entends-tu par "champ défini explicitement"?
|
Je réponds un peu tard, mais bon :
Je veux un XML, mais dont chacune des entrée référence explicitement son "parent".
Concrêtement en reprenant l'exemple précédent, chaque entrée "employee" dispose d'un identifiant unique "employeeId", et référence son parent par "reportsTo".
Cette mise en forme est nécessaire pour que le composant graphique de smartGWT puisse effectuer un rendu sous forme d'arbre.
Le tout doit être réalisé de manière dynamique, car je ne connais pas "à priori" l'arborescence d'objets que je sérialise.
Je m'en suis sorti par le système suivant :
1) je passe par Xstream pour serialiser mon objet java.
2) je récupère le flux XML sérialisé, que j'interprète via un parser XML
3) je passe de manière récursive à travers les nœuds du XML en reconstruisant une collection d'objets "nœud", où j'indique pour chaque nœud :
- un identifiant unique
- l'identifiant de son parent
4) je rattache cette collection à mon composant smartGWT
dans le détail, voici mon code de réinterprétation
Code :
- /**
- * transcode a standard object's XML to a specific GWT Compliant XML
- * @param inputXML the input XML String to transcode
- * @param withRoot keep root in result ?
- * @return the GWT compliant XML String
- * @throws DocumentException in case XML input can not be parsed
- */
- public Collection<TreeObject> transcodeBasicXMLtoGWTCompliantTreeNode(String inputXML, boolean withRoot)
- throws DocumentException {
- IndexHandler indexHandler = new IndexHandler();
- // retrieve input document
- Document inputDoc = DocumentHelper.parseText(inputXML);
- Element inputRoot = inputDoc.getRootElement();
- // create output document
- Collection<TreeObject> treeObjects = new ArrayList<TreeObject>();
- // process all subNodes
- if (withRoot) {
- extractNode(inputRoot, treeObjects, indexHandler, 1);
- } else {
- List<Element> subElements = inputRoot.elements();
- for (Element subElement : subElements) {
- extractNode(subElement, treeObjects, indexHandler, 1);
- }
- }
- return treeObjects;
- }
- private void extractNode(Element inputElement, Collection<TreeObject> treeObjects, IndexHandler indexHandler,
- int parentIndex) {
- // process the input Element
- int inputElementIndex = indexHandler.getNextValue();
- String inputElementName = inputElement.getQName().getName();
- boolean inputElementIsText = inputElement.isTextOnly();
- String inputElementText = null;
- if (inputElementIsText) {
- inputElementText = inputElement.getText();
- }
- TreeObject node = new TreeObject();
- node.setId(inputElementIndex);
- node.setParentId(parentIndex);
- node.setName(extractClassName(inputElementName));
- if (inputElementIsText) {
- node.setValue(inputElementText);
- } else {
- // add empty value : contains children
- node.setValue(StringUtils.EMPTY);
- }
- treeObjects.add(node);
- // process all subNodes
- List<Element> subElements = inputElement.elements();
- for (Element subElement : subElements) {
- extractNode(subElement, treeObjects, indexHandler, inputElementIndex);
- }
- }
- private String extractClassName(String fullQualifiedClassName) {
- if (fullQualifiedClassName != null && fullQualifiedClassName.length() > 0) {
- String[] splittedName = fullQualifiedClassName.split("\\." );
- if (splittedName.length > 1) {
- return splittedName[splittedName.length - 1];
- }
- }
- return fullQualifiedClassName;
- }
- /**
- * Private class managing the record's unique identifier.
- */
- private class IndexHandler {
- private int index;
- public IndexHandler() {
- index = 1;
- }
- public int getNextValue() {
- return ++index;
- }
- }
|
sachant que mon objet "nœud" est la classe TreeObject :
Code :
- /**
- * Generic TreeObject representation (for Java object detail view)
- */
- public class TreeObject implements Serializable {
- /** current node Id */
- private int id;
- /** parent node Id */
- private int parentId;
- /** attribute name */
- private String name;
- /** attribute value */
- private String value;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public int getParentId() {
- return parentId;
- }
- public void setParentId(int parentId) {
- this.parentId = parentId;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getValue() {
- return value;
- }
- public void setValue(String value) {
- this.value = value;
- }
- }
|
et enfin, voici comment j'effectue le rendu via smartGWT
De cette manière, il est possible de représenter sous forme d'arbre n'importe quel objet JAVA (à condition qu'il ne contienne pas de récursivité) en le convertissant en XML via xstream.toXml(object), et en réinterprétant le flux XML ![:jap: :jap:](https://forum-images.hardware.fr/icones/smilies/jap.gif) |