2009-12-31 17 views
7
के बजाय TinyElementImpl रिटर्न

मैं निम्नलिखित कोड है:सैक्सन XPath एपीआई org.w3c.dom.Node

// xpath evaluates to net.sf.saxon.xpath.XPathEvaluator 
XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expression = xpath.compile("/foo/bar"); 
Object evaluate = expression.evaluate(someXML, XPathConstants.NODE); 
Object evaluate2 = expression.evaluate(someXML, XPathConstants.NODESET); 

System.out.println(evaluate!=null?evaluate.getClass():"null"); 
System.out.println(evaluate2!=null?evaluate2.getClass():"null2"); 

System.out.println(evaluate instanceof Node); 
System.out.println(evaluate2 instanceof NodeList); 

और यह परिणाम है ...

 
class net.sf.saxon.tinytree.TinyElementImpl 
class java.util.ArrayList 
false 
false 

बस स्पष्ट करने के लिए , अगर मैं ऐसा करते हैं:

org.w3c.dom.Node node = (org.w3c.dom.Node)evaluate; 

या

org.w3c.dom.NodeList node = (org.w3c.dom.NodeList)evaluate2; 

मैं एक ClassCastException

कैसे है कि हो सकता है मिल सकता है? संस जावा 1.5 API नोड अनुसार और nodeset org.w3c.dom.Node और org.w3c.dom.NodeList करने के लिए नक्शे चाहिए क्रमशः

बस clarify2 को हाँ मैं जानता हूँ कि नोड एक iterface है, कि getClass() एक ठोस वर्ग देता है।

उत्तर

6

ठीक है मैंने इसे समझ लिया!

यदि मूल्यांकन विधि इनपुट इनपुट प्राप्त करती है तो उपर्युक्त त्रुटि होती है।

उदा।

InputSource someXML = new InputSource(new StringReader("<someXML>...</someXML>)"); 
Object result = expression.evaluate(someXML, XPathConstants.NODE); 
Node node = (Node) result; // ClassCastException 

फिर परिणाम को लागू नहीं किया गया है org.w3c.dom.Node (TinyElementImpl)

लेकिन अगर मूल्यांकन एक Node (या एक Document) प्राप्त करता है:

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 

यह काम करता है, लेकिन अभी भी, इस अजीब है ..

+0

समझ में आता है .... यदि आप डब्ल्यू 3 सी डोम डालते हैं, तो आपको डब्ल्यू 3 सी डोम मिल जाता है। अन्यथा, आप मालिकाना डोम बाहर मिलता है। – skaffman

+2

जावा एक्सएमएल में आपका स्वागत है। – Esko

2

Node एक इंटरफ़ेस है। कार्यान्वयन के लिए आपके पास एक ठोस वर्ग होना चाहिए। और getClass() उस ठोस वर्ग को लौटाता है। टिप्पणी

जवाब में

संपादित करने के लिए:

क्षमा करें, मैं instanceof पर ध्यान देना नहीं था। source code पर देखकर, ऐसा लगता है कि TinyNodeImplorg.w3c.dom.Node लागू नहीं करता है। और जेडीके दस्तावेज़ों को देखते हुए, ऐसा प्रतीत होता है कि यह नहीं है: javax.xml.XPath के लिए दस्तावेज़ आपको परिणाम प्रकार के लिए XPathConstants पर संदर्भित करता है, और यह "XPath 1.0 नोडसेट डेटा प्रकार" को संदर्भित करता है (जो, यदि आप देखते हैं XPath 1.0 spec, परिभाषित नहीं किया गया है)।

तो ऐसा लगता है कि XPath API से रिटर्न केवल उस API के भीतर उपयोग किए जाने पर संगत होने की आवश्यकता होती है। बिल्कुल वही नहीं जो आप सुनना चाहते थे, मुझे यकीन है। क्या आप अंतर्निहित जेडीके कार्यान्वयन का उपयोग कर सकते हैं? मुझे पता है कि यह org.w3c.dom ऑब्जेक्ट्स देता है।

+0

धन्यवाद, मैं सवाल स्पष्ट करेंगे। और हां, मुझे क्लासकास्ट एक्सेप्शन मिलता है, आप बता सकते हैं कि कोड की आखिरी 2 पंक्तियों (नोड के उदाहरण का मूल्यांकन करें) यदि यह उदाहरण नहीं है, तो यह उस इंटरफ़ेस को लागू नहीं करता है, इस प्रकार एक क्लास कास्ट सिंटिनो होगा। –

-1

kdgregory सही है कि Node सिर्फ एक इंटरफ़ेस है, और TinyElementImpl उस इंटरफ़ेस को लागू करता है। expression.evaluate()Node का एक उदाहरण वापस नहीं कर सकता है, इसे एक ठोस वर्ग वापस करना है जो नोड लागू करता है।

यह कहना है कि आप Node रूप रूप TinyElementImplका एक उदाहरण का उपयोग कर सकते उपयोगी हो सकता है, और आप आसानी Node को TinyElementImp के उदाहरण डाली कर सकते हैं।

उदाहरण के लिए, यह सिर्फ ठीक काम करना चाहिए:

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

फिर आप Node के तरीकों में से किसी को बुला, द्वारा और यह किसी भी विधि है जो एक Node स्वीकार करता है करने के लिए पारित करके result उपयोग कर सकते हैं।

+0

कृपया kdgregory के उत्तर पर टिप्पणी पढ़ें। TinyElementImpl रास्ते से नोड को लागू नहीं करता है। –

+0

ठीक है, हाँ, मुझे लगता है कि मैंने गलत धारणा की है। फिर भी, मुझे लगता है कि मेरे उत्तर की भावना प्रश्न के कुछ पहलुओं को मदद करने के लिए एक ईमानदार प्रयास में संबोधित करती है। हालांकि मैं डाउनवोट के साथ रह सकता हूं। –

2

यह थोड़ा अजीब है, यह एक है। Saxon javadoc कहता है कि TinyElementImpl किसी भी org.w3c.dom इंटरफेस को लागू नहीं करता है, और फिर भी आप उन्हें XPath मूल्यांकन से वापस ले रहे हैं।

मेरा अनुमान है कि सैक्सन मानक डीओएम मॉडल को अपने स्वयं के पक्ष में छोड़ देता है। मुझे संदेह है कि XPathConstants.NODE जो आप evaluate पर पास करते हैं, वास्तव में केवल एक संकेत है। XPath अभिव्यक्तियों को किसी भी पुरानी चीज़ को वापस करने की अनुमति है (उदाहरण के लिए, Apache JXPath जावा ऑब्जेक्ट ग्राफ़ क्वेरी करने के लिए XPath अभिव्यक्तियों का उपयोग करता है), इसलिए सैक्सन को org.w3c मानक वाले के बजाय अपने स्वयं के DOM प्रकार वापस करने की अनुमति है।

समाधान: या तो सैक्सन डोम प्रकारों को लौटाए जाने के रूप में उपयोग करें, या सैक्सन का उपयोग न करें।

3

इस कोड को आजमाएं:

Object evaluate = expression.evaluate(someXML, XPathConstants.NODE); 
System.out.println(evaluate instanceof Node); 
System.out.println(NodeOverNodeInfo.wrap((NodeInfo) evaluate) instanceof Node); 

यह प्रिंट:

false 
true 

लौटे वस्तु, प्रकार NodeInfo की है, तो आप एक असली Node के रूप में लपेट, इसलिए आपको उसके तरीकों का उपयोग कर सकते की जरूरत है:

Node n = NodeOverNodeInfo.wrap((NodeInfo) evaluate); 
System.out.println(n.getNodeName()); 
System.out.println(n.getTextContent()); 
+0

यह काम करता है और पृष्ठ पर सबसे उपयोगी उत्तर है। बहुत बढ़िया! –