J'ai écrit ce que je veux atteindre. Cependant, getElementidx () code> ne renvoie pas le nombre de comptes appropriés. Il y a un problème avec getPreviousikebling () code> mais je ne sais pas pourquoi.
3 Réponses :
Le support DOM4J XPath est vraiment bon, vous pouvez accéder à n'importe quel élément en fournissant l'expression XPath.
Cependant, je ne suis pas sûr de savoir si l'inverse est vrai, c'est-à-dire qu'il soit donné d'un élément que vous pouvez dériver l'expression XPath. p>
Voir l'API à http://www.docjar.com/ Projets / DOM4J-1.6.1-CODE.HTML P>
Remarque Évitez www.dom4j.org, il semble avoir été hi-branché par une sorte de ferme spammy Link. P>
Oui, c'est possible dans DOM4J: Utilisez nœud.getuniquepath () code>. Cependant, vous devez d'abord convertir le document W3C en un document DOM4J. En fait, c'est très facile (il suffit d'utiliser neuf Domreader (). Lire (w3cdocument) code>), mais ce n'est pas une solution très efficace, surtout si la conversion doit être effectuée à plusieurs reprises.
Quelle est une meilleure approche? En ce moment, j'essaie simplement de traduire cette fonction JavaScript en Java. snippets.dzone.com/posts/show/3754
@Chris, que si le DOM4J est utilisé à plusieurs reprises? Serait-ce lent ou perdu la mémoire?
@KIM: Non, si vous utilisez DOM4J au lieu de W3C DOM sans traduire entre eux, il n'y a pas de pénalité de performance.
@Chris, je fais la traduction. Je suis déjà à mi-parcours en écrivant une fonction pour construire cardinal xpath à partir d'org.w3c.dom.domdocument et aussi à lire xpath. Devrais-je continuer cette poursuite ou passer à dom4j. Si la pénalité n'est pas mauvaise pour la traduction de la traduction du document W3C DOM, je pourrais aussi bien ...
@KIM: Cela dépend beaucoup de la taille du document, de la fréquence de traduction, etc. Je vous suggère de tester les différentes solutions et de les comparer.
DOM4J est vraiment bon mais je ne peux pas transférer org.w3c.dom.domelement à org.dom4j.dom.domelement. Cela signifie que je dois générer XPath basé sur l'org.w3c.dom actuel .....
J'ai joué avec le Bibliothèque XOM , qui a une bonne API. Faire cela à pied est plus difficile que dans XSLT. Ce qui suit vous fera commencer. Notez que la position de la position de frère de soeur est manquante.
une interface: p> classe d'exécution: p> un autre , en prolongeant. Cela fait le @id Stuff. P> une autre classe en tant que frontend: p> et un script de test: P> <Urmel>
<!-- spukt im Schloss -->
<Monster xmlns="urn:X-Monster">
<Gurke>
<?Garten eins="zwei" drei="vier"?>
<Heini Hecht="toll">
<eins>eins</eins>
<zwei id="ich-bin-die-zwei">zwei</zwei>
<drei letzt="1">drei</drei>
</Heini>
<!-- Es kann nur einen geben :-) -->
</Gurke>
<Tomate id="pomodoro">
<eene/>
<meene/>
<miste>Auweia!</miste>
<aa>
<bb>
<cc>dd</cc>
</bb>
</aa>
</Tomate>
</Monster>
</Urmel>
J'ai créé une version beaucoup plus courte, mais cela ne fonctionne pas à 100%. J'ai mis à jour ma question.
Votre titre Talks sur Le fait que vous attrapez et que vous avalez des exceptions est aussi profondément méfiant ... Pourquoi voudriez-vous faire cela? Si vous avez une exception, la méthode ne devrait-elle pas terminer avec une exception? P> Vous devez également tenir compte probablement du fait que Si ceux-ci ne vous aident pas, veuillez publier un échantillon XML, pointez sur Un nœud, et dire ce que le code est actuellement renvoyé (ainsi que l'affichage de votre code mis à jour). Il suffit de dire que cela ne renvoie pas que le nombre approprié n'est pas aussi utile que de dire ce que est de retour em> et ce que vous em> attendez-vous. P> < P> Edit: C'est ce que je m'attendrais à ce que le code ressemble à: p> Vous pouvez également utiliser getPreviousibling () code>, mais votre code utilise uniquement getnextsibling () code> - pourquoi? Je ne peux pas voir pourquoi vous voudriez utiliser getnextsibling () code> du tout ... Vous voulez savoir combien d'éléments du même nom viennent avant em> le courant Un, pas combien de viennent après em> it. getPreviousibling code> peut ne pas renvoyer un élément - il peut retourner Un nœud texte, par exemple. Vous voudrez sauter sur ceux - vous obtiendrez actuellement une exception, ce qui mettrait fin à la boucle et de renvoyer le nombre actuel. P> si (node.getypeType () == noeud. Ollement_node) code> au lieu de l'instance d'instance code> test. P> p>
Oui. C'était une faute de frappe. Je veux dire ne getpreviousikebling () seulement. Nextsibling () n'a pas de sens. Fondamentalement, seulement 1 est renvoyé par cette fonction. getElementidx (élément) code> est censé compter tous les frères et sœurs précédents qui est un ollement_node code> et antérieurs.Tagname code> correspondent élément.tagname < / code>. Donc, je me retrouverais avec / html / corps / p [3] quelque chose comme ça.
@Kim: Et la manipulation de l'exception? Si le premier "frère précédent" n'est pas un élément, cela expliquerait pourquoi vous obtenez un compte de 1 ... et une exception sera lancée immédiatement en raison de la mauvaise distribution, et vous allez simplement retourner la valeur actuelle. Avaler des exceptions est presque toujours i> une mauvaise idée. En outre, y a-t-il une raison pour laquelle vous utilisez Domélation au lieu de l'élément juste? Il vaut mieux s'en tenir aux types W3C dans la mesure du possible, imo. Si vous pouviez changer votre code en un programme court mais complet, nous pourrions tous courir, cela aiderait aussi ...
Oui, la manipulation des exceptions ne semble pas non plus ici. Je voulais juste que le pour la boucle continue même lorsque l'exception est levée ... Oui, je comprends que cette exception est immédiatement soulevée et c'est pourquoi je reçois toujours 1 et la trace de pile montre qu'il s'agit essentiellement de la mauvaise moulage. DomElement hérite d'org.w3c.dom.Leement. Il suffit de faire des fonctionnalités supplémentaires. Je ne sais pas ce qui arrive à ma question lorsque la prime expire, sera-t-elle supprimée? Je vais essayer de poser cette question à nouveau avec une prime distincte ..
La chose est que je ne comprends pas pourquoi ni où l'exception est avalée. Je veux dire, quand je n'atteint pas les choses, le code est-il juste comme rien n'a mal tourné. Comment indemniser une exception?
@KIM: Si vous retirez le bloc de capture, l'exception sera lancée. Cela ne va pas "gérer comme rien ne t'accordé". Il n'est pas nécessaire de poser la question à la question à nouveau i> (vous en avez plusieurs similaires). Cela aurait vraiment aidé si vous êtes indiqué i> que vous saviez qu'il y avait une exception pour commencer. Je vais ajouter une implémentation alternative suggérée à ma réponse.
@KIM JONG WOO: En termes d'exception avalant, je remarque que vous avalez toutes les exceptions à deux i> niveaux de code. Arrêtez juste de le faire :)
Ugh .... Je vois ce que j'ai négligé. Soupir I échoue totalement au codage. org.w3c.dom.node.getPreviousikeding () Code> .... Je pensais que cette méthode retournerait domenement code>. Je n'ai pas vu qu'il renvoie un noeud code> code> jusqu'à présent. Merci beaucoup pour cette réponse.
Veuillez décrire plus de près le format XPath que vous souhaitez obtenir, ou peut-être simplement indiquer le but de l'expression XPath que vous souhaitez que la fonction redevienne. J'ai remarqué la fonction JavaScript poignée de manière spéciale. Est-ce que vous ou ne voulez pas payer une attention particulière à @ID?
Aussi, dans votre première phrase, vous écrivez
getElementyxpath () code>, quand je pense que vous voulezgetxpathforelement () code> - Pourriez-vous clarifier?Michael, oui c'est correct. Je veux attention à @ID. Donc, je vais obtenir comme format XPath comme suivant
// div [@ Id = "MENI"] / SPAN / A [2] CODE>.com.colaxa.xml.xpathutils.getxpathexprfromnode (noeud) n'est-ce pas ce que vous recherchez?
Pardon. mauvais paquet dans le premier commentaire. com.ibm.wsdl.util.xml.getxpathexprfromnode (noeud) n'est-ce pas ce que vous cherchez?