8
votes

Saxon XPath API renvoie TinyElementImpl au lieu d'org.w3c.dom.node

J'ai le code suivant: xxx

et ceci est le résultat ... xxx

juste pour clarifier < / Strong>, si je fais cela: xxx

ou xxx

i obtenir un classcastexception

Comment cela peut-il être? Selon Suns Java 1.5 API < / a> nœud et nodeset doit mapper sur org.w3c.dom.node et org.w3c.dom.Nodelist respectivement

juste Pour clarifier2 Oui, je sais que le nœud est une iterface, que GetClass () renvoie une classe de béton.


0 commentaires

5 Réponses :


2
votes

nœud est une interface. Vous devez avoir une classe concrète pour la mise en œuvre. Et getclass () retourne cette classe de béton.

Modifier en réponse au commentaire:

Désolé, je n'ai pas fait attention à l'instance de. En regardant le code source , il apparaît que tinynodeimpl ne met pas en œuvre org.w3c.dom.node . Et en regardant les documents JDK, il semble que cela ne soit pas obligé de: le Doc pour Javax.xml.xpath vous désigne XPathConstants pour le type de résultat, et il fait référence au type" The XPath 1.0 NodeT Type de données "(qui, si vous regardez sur la spécification XPath 1.0, n'est pas défini. ).

Donc, il semble que les retours de l'API XPath ne soient que cohérents lorsqu'ils sont utilisés dans cette API. Pas exactement ce que vous vouliez entendre, je suis sûr. Pouvez-vous utiliser la mise en œuvre JDK intégrée? Je sais que cela renvoie org.w3c.dom objets.


1 commentaires

Merci, je vais clarifier la question. Et oui, je reçois une classe de classe, vous pouvez le dire par les 2 dernières lignes du code (Évaluez l'instance de noeud) si ce n'est pas une instanceOf, il n'applique pas cette interface, une classe exceptionnelle n'aura qu'un.



-1
votes

kdgregory est correct que nœud code> est juste une interface, et tinyelementimpl code> implémente cette interface. expression.valua () code> ne peut pas renvoyer une instance de nœud code>, il doit renvoyer une classe de béton que implémente em> noeud.

IT Peut-être utile de souligner que vous pouvez utiliser une instance de tinyelementimpl code> comme em> comme noeud code>, et vous pouvez facilement lancer des instances de tinyélémentalementimp code> à noeud code>. p>

Par exemple, cela devrait fonctionner simplement: P>

Node result = (Node) expression.evaluate(someXML, XPathConstants.NODE);


2 commentaires

Veuillez lire le commentaire sur la réponse de KdGregory. TinyelementalImpl ne met pas en œuvre le noeud au fait.


Ok, oui, je vois que j'ai fait une hypothèse incorrecte. Néanmoins, je pense que l'esprit de ma réponse traite de certains aspects de la question dans un effort honnête pour aider. Je peux vivre avec le Downvote.



2
votes

C'est un peu étrange, celui-ci. Saxon Javadoc dit que TinyelementImpl ne Implémentez n'importe laquelle des interfaces org.w3c.dom et pourtant les récupérer de l'évaluation XPath.

Je suppose que Saxon évite le modèle DOM standard en faveur de son propre. Je soupçonne que le xpathConstants.node que vous passez à évaluer est vraiment juste un indice. Il est permis aux expressions de XPath de retourner n'importe quelle vieille chose (par exemple, Apache JXPath utilise des expressions XPath pour interroger Java Objects graphiques), il est donc autorisé pour Saxon de renvoyer ses propres types DOM plutôt que sur org.w3c standard.

solution: Utilisez les types DOM SAXON, comme retourné ou n'utilisez pas Saxon.


0 commentaires

7
votes

OK Je l'ai compris!

Si la méthode d'évaluation reçoit une sortie d'entrée, l'erreur ci-dessus se produit. P>

E.g. P>

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document someXML = documentBuilder.parse(new InputSource(new StringReader("<someXML>...</someXML>)"));
Object result = expression.evaluate(someXML, XPathConstants.NODE);
Node node = (Node) result; // works


1 commentaires

A du sens .... Si vous mettez W3C DOM dans, vous obtenez W3C Dom Out. Sinon, vous êtes exclusif DOM.



3
votes

Essayez ce code: xxx

IT imprime: xxx

L'objet renvoyé est de type nodeInfo , vous avez donc besoin d'envelopper comme un vrai noeud , vous pouvez donc accéder à ses méthodes: xxx


1 commentaires

Cela fonctionne et est la réponse la plus utile sur la page. Bien fait!