Archive for the ‘XML/XSD’ Category
Voici une façon de le faire rapidement et proprement.
Ici le but du jeu est de mettre à jour le contenu texte du nœud
name (en lui appliquant un trim-plus-plus, version améliorée d'un
String.trim()).
String file_path = dir_dataset_path + "/" + dir_path + "/" + file_name;
Document d = null;
try {
d = dbfactory.newDocumentBuilder().parse(new InputSource(file_path));
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
NodeList nl = d.getElementsByTagName("name");
for (int i = 0; i < nl.getLength(); ++i) {
Node n = nl.item(i);
n.setTextContent(trimpp(n.getTextContent()));
}
Result result = new StreamResult(new File(file_path));
Source source = new DOMSource(d);
try {
transformer.transform(source, result);
} catch (TransformerException e) {
e.printStackTrace();
}
Mais cela reste du
DOM, quand j'aurais le temps je garderai du côté de StAX ou WAX...
Pour écrire des scripts XQuery sous Eclipse, il n'y a pas pléthore de plugins pour apporter de l'autocomplétion, coloration syntaxique, et de la vérification de syntaxe.
- DataDirect XQuery
- XQDT
- xqIde: coloration syntaxique, vérification de syntaxe, génération de xqDoc, et intégration avec la database Marklogic pour l'exécution de requête XQuery.
Bug avec XQDT:
Si dans votre précédente session d'Eclipse, le Workbench contenait un ficher .xq ouvert, le prochain lancement d'Eclipse est bloqué par l'exception suivante:
Exception in thread "Thread-2" org.eclipse.swt.SWTException: Device is
disposed
at org.eclipse.swt.SWT.error(SWT.java:3777)
at org.eclipse.swt.SWT.error(SWT.java:3695)
at org.eclipse.swt.SWT.error(SWT.java:3666)
at org.eclipse.swt.widgets.Display.error(Display.java:1142)
at org.eclipse.swt.widgets.Display.wake(Display.java:4068)
at
org.eclipse.ui.application.WorkbenchAdvisor$1.run(WorkbenchAdvisor.java:797
)
Cette exception bloque complètement le chargement d'Eclipse.
Si il n'y a pas de .xq d'ouvert dans la session précédente de Eclipse, il n'y a pas de problèmes, le plugin fonctionne correctement.
Problème rencontré avec Java1.6, Ubuntu 8.04 Hardy Heron et Eclipse Ganymede for
Java developer Linux GTK.
J'investigue sur LabelMe, en ce moment sur les annotations faites manuellement et disponible sous la forme de fichiers
XML générés par la toolbox MATLAB du projet.
Ainsi je traite les documents
XML, et un outil très pratique est
http://www.hitsw.com/xml_utilites/ pour retrouver une grammaire XSD à partir d'une instance, c'est très pratique.
Cela m'a permis d'obtenir
une grammaire des annotations LabelMe, d'où la génération d'un
XML-Binding et un (un)marshalling en Java.
Pour un petit projet j'ai intégré
une grammaire XSD de DublinCore avec l'élément import dans une grammaire perso issue de mes travaux,
imageLibrary.xsd.
A propos, une ressource documentaire très intéressante sur les XSD est:
http://www.datypic.com/books/defxmlschema/chapter04.html.
Dans le cas présent, c'est une application Web de recherche d'imagette de livre depuis les AWS, Amazon Web Services, et l'ajout ou le retrait d'une imagette à un profil de lecture en quelque sortes.
Les imagettes sont stockées en local sur le serveur, et un fichier
XML pour chaque profil contient les informations sur les fichiers images (metadata physiques, i.e. location, size etc.) ainsi que les données relatives au document obtenues par les AWS et intégrées dans des éléments
XML DublinCore (creator, title etc.).
Je génère des pages
XHTML qui contiennent mes éléments DublinCore marshallés, il faut ainsi que JAXB génère des fragments
XML et non un document
XML complet.
Pour faire en sorte que JAXB ne génère pas l'
instruction processing du document
XML lors de l'opération de marshalling, il faut utiliser la propriété suivante:
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
m étant un Marshaller.
Autre point: bien que j'ai spécifié que mon élément contenant mes données DublinCore comme élément du document
XML, (i.e. il fait partie des éléments déclarés dans ma XSD), JAXB ne veut pas marshaller uniquement cet élément.
Une exception est levée disant qu'il manque l'annotation @XmlRootElement dans la classe de binding de cet élément.
Ce post sur java.net en parle mais ne répond pas vraiment au problème.
Ajouter cette annotation à la classe de binding résout le problème mais l'élément étant déclaré dans ma XSD, cette modification ne devrait pas être nécessaire...
Cependant, pour Unmarshaller un fragment
XML, on peut passer par un
XMLStreamReader, et passer cet objet à l'unmarshaller (une rapide
overview), on doit pouvoir en faire de même pour le marshalling.
Dans le cadre d'un prototype sur mes recherches, j'investigue sur
MPEG-7.
Au début, j'avais définit un format de fichier de description, j'ai écrit une grammaire
XML assez sommaire pour avancer assez rapidement, et produire des fichiers
XML pour décrire, stocker des descripteurs, et annoter mes documents multimédia, mais au fur et à mesure que j'avançais, je m'approchais vraiment de ce que propose la norme.
C'est pourquoi depuis quelques temps, je m'attaque à un
XML binding en Java de la norme
MPEG-7.
Le langage Java propose dans son
API un mécanisme de
XML binding (depuis Java1.6, dans les versions précédente de Java c'était l'
API Jaxb, Java
API for
XML binding, qui était située dans un package externe, le JWSDP Java Web Services Developer Pack), et pour les normes comme
MPEG-7 basé sur des
XML-schemas, c'est très pratique.
(J'aurais bientôt a travailler sur
MPEG-21 pour les besoins d'un projet de labo, j'essayerai la même approche pour la production d'une requête
MPEG-21, j'en reparlerai ici en temps et en heure).
Pour la génération du binding, il y a JAXB (Sun) et XMLBeans (Apache), avec ces 2 frameworks, il y a des problèmes de compilations du bindings (grammaire non valide), dans les deux cas il semble y avoir un problème avec des définitions d'éléments au noms identique, ce n'est pas un problème de définition dans la norme, mais plutôt des outils JAXB et XMLBeans2.3 qui ne gèrent pas correctement l'inheritance à outrance utilisé dans la norme
MPEG-7. (réf. nécessaire).
Quelques liens web parlant du problème:
Il semble plus sérieux d'utiliser XMLBeans2.3, car malgré une petite modification aux schemas
MPEG-7 à faire, la modification reste acceptable.
JAXB quand à lui nécessite de modifier le nom de certains éléments, ce qui pourrait amener à des problèmes (fichiers
MPEG-7 générés non
MPEG-7 compliant).
Avec JAXB
Avec JAXB (version java1.6) des collisions de noms sont un problème, voir
http://cbvr.ims.tuwien.ac.at/user-documentation/mpeg7-java-binding-1.pdf. Il y en a plusieurs, c'est bloquant. La correction à apporter aux schemas est de modifier les noms de plusieurs éléments (à priori pas très pratique donc, car le
MPEG-7 résultant ne valide plus la norme). La correction proposée ci-dessous pour XMLBeans2.3 fonctionne également avec JAXB, mais elle ne suffit pas, il y a des propriétés au nom identique dans
mds-2001.xsd et Jaxb génère une erreur "already define";
Une solution pour contourner cela semble l'utilisation de
custumizations JAXB.
Avec XMLBeans
Avec XMLBeans2.3, il y a un problème dans
audio-2001.xsd mais qui peut être corrigé rapidement, voir
http://iiss039.joanneum.at/cms/index.php?id=231 (recherche menée par Joanum Research propose également un profile mpeg-7, le DAVP detailed AudioVisual Profile, pour la description de contenu audiovisuel simple, dans le sens de single);
Quelques liens:
- VizIR web server project: équipe autrichienne, membre du noe DELOS, utilise JAXB pour la génération du binding;
- le laboratoire Joaennum propose une librairie en C++ pour manipuler des documents MPEG-7, (avec un XML-binding en C++ développé maison), cette librairie de contient pas de features extractors. Ce laboratoire propose également une génération de XML-binding en Java utilisant XMLBeans (déjà cité plus haut);
- mpeg-7 and mpeg-21 community portal, voir dans la section "software and tools" une liste de projet autour de ou utilisant MPEG-7;
- LAS, Lightweigth Application Server for mpeg-7, utilise XMLBeans, dans le cadre du projet MECCA;
- un projet d'élève de l'université polytechnique de catalogne d'annotation de photographie, utilise XMLBeans. D'autres projets d'élèves de la même université qui utilise également XMLBeans;
- le site du NIST pour récupérer les schemas, et qui propose un validateur;