2010-03-04 7 views
3

J'essaie de trouver la meilleure façon de traduire ceci:XML Parsing/Dom Manipulation en Java

<Source><properties> 
    .... 
    <name>wer</name> 
    <delay> 
    <type>Deterministic</type> 
    <parameters length="1"> 
     <param value="78" type="Time"/> 
    </parameters> 
    </delay> 
    <batchSize> 
    <type>Cauchy</type> 
    <parameters length="2"> 
     <param value="23" type="Alpha"/> 
    <param value="7878" type="Beta"/> 
    </parameters> 
    </batchSize> 
... 
</properties></Source> 

en:

<Source><properties> 
    .... 
    <name>wer</name> 
    <delay> 
    <Deterministic Time="78"/> 
    </delay> 
    <batchSize> 
     <Cauchy Alpha="23" Beta="7878"/> 
    </batchSize> 
........ 
</properties></Source> 

J'ai essayé d'utiliser DocumentBuilderFactory, mais je alors que je peut accéder à la valeur de l'étiquette de nom, je ne peux pas accéder aux valeurs dans la section de retard/lot. C'est le code I utilisé

Element prop = (Element)propertyNode; 

NodeList nodeIDProperties = prop.getElementsByTagName("name"); 
Element nameElement = (Element)nodeIDProperties.item(0); 

NodeList textFNList = nameElement.getChildNodes(); 
String nodeNameValue = ((org.w3c.dom.Node)textFNList.item(0)).getNodeValue().trim(); 

//-------- 
NodeList delayNode = prop.getElementsByTagName("delay"); 

Appel getElementByName (« type ») ou « paramètres » ne semble pas retourner tout ce que je peux travailler avec. Ai-je manqué quelque chose, ou y a-t-il une façon plus propre de traiter le xml existant?

Le besoin d'être dans le format défini pour permettre le marshalling et unmarshalling par Castor.

Toute aide serait grandement appréciée.

+4

Ceci est plus de la transformation XML, ne devriez-vous pas utiliser XSLT? – saugata

+1

Je recommanderais fortement d'utiliser XPATH pour faire de l'analyse XML, c'est beaucoup plus logique à mon avis. Voici un excellent tutoriel (http://www.ibm.com/developerworks/library/x-javaxpathapi.html). Pourriez-vous également préciser ce que vous obtenez exactement lorsque vous appelez getElementsByName ("type")? NullPointerExceptions/Chaînes vides? – Luhar

+0

Votre titre est incorrect, vous n'êtes pas en train d'analyser mais de manipuler un arbre DOM. –

Répondre

5

Il existe une variété de façons de convertir les données XML.

1) Vous pouvez utiliser XSLT (XSL Transformations) pour transformer le XML. Il s'agit d'un langage XML utilisé pour transformer des documents XML dans d'autres documents XML, texte ou HTML. La syntaxe est difficile à apprendre. Cependant, c'est un outil puissant pour la conversion XML. Here est un tutoriel. Pour l'utilisation de XSLT avec Java, je recommanderais Saxon, qui est également livré avec une belle documentation. Le gros plus en utilisant XSLT est que la conversion peut être externalisée dans un modèle séparé. Votre code Java n'est donc pas obscurci par la traduction. Cependant, comme mentionné, la courbe d'apprentissage est nettement plus raide.

2) Vous pouvez utiliser XPath pour sélectionner facilement les nœuds. XPath est un langage de requête pour sélectionner des nœuds dans un document XML. XPath est également utilisé dans XSLT. Par exemple. la requête XPath

//delay[type = 'Deterministic']/parameters/param/@value 

sélectionne tous les paramètres value qui sont contenues dans un noeud param qui sont un enfant de delay contenant un noeud type avec la valeur « déterministe ». Here est une application web agréable pour tester les requêtes XPath. Here est un tutoriel sur l'utilisation de XPath en Java et here sur XPath en général. Vous pouvez utiliser des expressions XPath pour sélectionner les bons nœuds dans votre code Java. À mon humble avis ceci est beaucoup plus lisible et maintenable que d'utiliser le modèle d'objet DOM directement (qui est aussi de temps en temps comme vous l'avez déjà appris). 3) Vous pouvez utiliser Smooks pour faire XML transformations. Ceci est particulièrement utile si la transformation devient plutôt complexe. Smooks remplit un modèle d'objet à partir du XML d'entrée et génère le résultat XML via un mécanisme de modèle utilisant des modèles Freemarker ou XSL. Smooks a un très haut débit et est utilisé dans des environnements à haute performance comme les ESB (par exemple JBoss ESB, Apache ServiceMix). Pourrait être maîtrisé pour votre scénario si.

4) Vous pouvez utiliser Freemarker pour effectuer la transformation. Je n'ai aucune expérience dans ce domaine, mais comme je l'ai entendu, il peut être utilisé assez simple.Voir le "Declarative XML processing" section de la documentation (jetez également un oeil à "Exposing XML documents" pour apprendre à lire le code source). Cela me semble assez simple. Si vous tentez votre chance avec cette approche, j'aimerais en entendre parler.

+0

Vous avez résumé ce que les autres gars ont dit. Merci. Je vais regarder dans XSLT et si la courbe est trop raide (sur un peu de temps) alors je vais utiliser la requête XPath. Merci. – Babyangle86

+0

J'ai vu ça. J'ai donc ajouté quelques ressources supplémentaires. Freemarker semble être vraiment utile dans votre scénario ... – spa

+0

XSLT n'est pas mauvais si vous êtes familier avec les langages LISP-y. –

0

XSLT était la voie à suivre à la fin. C'est en fait assez facile à utiliser et l'exemple de w3schools est un bon point de départ.