2012-05-23 11 views
7

मैं इस फ़ाइल पर एक XPath क्वेरी करना चाहते हैं (अंश दिखाया गया है):जावा XPath: डिफ़ॉल्ट नाम स्थान xmlns वाली क्वेरी

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document document = builder.parse(new File(testFile)); 
XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
... 

String result = xpath.evaluate(xpathQueryString, document); 
System.out.println(result); 
:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST --> 
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0"> 
    <ModelClass.Parent> 
     <Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/> 

यह मैं उपयोग कर रहा हूँ कोड का एक टुकड़ा है

मुझे जिस समस्या का सामना करना पड़ रहा है वह यह है कि जब डिफ़ॉल्ट नामस्थान को XPath क्वेरी में संदर्भित किया जाता है, तो getNamespaceURI विधि को हल करने के लिए नहीं कहा जाता है।

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

अब मैं कर दिया है की कोशिश की एक नकली उपसर्ग d साथ xmlns की जगह और फिर getNamespaceURI विधि तदनुसार लिख कर पार्सर "धोखा देना" (ताकि http://xml.sap.com/2002/10/metamodel/webdynpro वापस जाने के लिए: उदाहरण के लिए इस क्वेरी कुछ भी अलग नहीं है जब d का सामना करना पड़ता है)। इस मामले में, getNamespaceURI कहा जाता है लेकिन XPath अभिव्यक्ति मूल्यांकन का परिणाम हमेशा एक खाली स्ट्रिंग होता है।

यदि मैं फ़ाइल से और XPath क्वेरी अभिव्यक्ति से नामस्थान निकाल देता हूं, तो मैं जिस स्ट्रिंग को चाहता था उसे प्राप्त कर सकता हूं (com.test.mypackage)।

क्या डिफ़ॉल्ट नामस्थान के साथ चीजों को सही तरीके से काम करने का कोई तरीका है?

उत्तर

8

अपने Namespace संदर्भ में, एक उपसर्ग अपनी पसंद का (जैसे df) नाम स्थान यूआरआई के लिए दस्तावेज़ में

xpath.setNamespaceContext(new NamespaceContext() { 
    public String getNamespaceURI(String prefix) { 
     switch (prefix) { 
     case "df": return "http://xml.sap.com/2002/10/metamodel/webdynpro"; 
     ... 
     } 
    }); 

बाँध और फिर अपने पथ भाव में है कि उपसर्ग का उपयोग तत्व नामों जैसे अर्हता प्राप्त करने के /df:ModelClass/df:ModelClass.Parent/df:Core.Reference[@type = 'Model']/@package

+0

हाय मार्टिन, मैंने कोशिश की है लेकिन यह काम नहीं करता है ... –

+4

सुनिश्चित करें कि आप नामस्थान जागरूक दस्तावेज़बिल्डर भी बना सकते हैं http://docs.oracle.com/javase/6/docs/api/javax/ नामस्थानों के साथ काम करने से पहले xml/parsers/DocumentBuilderFactory.html # setNamespaceAware% 28boolean% 29। –

+0

यह चाल है। मैंने सोचा कि दस्तावेज़बिल्डर डिफ़ॉल्ट रूप से नामस्थानों से अवगत था। फिर से धन्यवाद। –

10

XPath 1.0 विनिर्देश के लिए आवश्यक है कि "कोई उपसर्ग का कोई नामस्थान नहीं है"। इसलिए जेएपीपी, जिसे एक्सपीएथ 1.0 के लिए डिज़ाइन किया गया था, आपको कुछ गैर-शून्य नामस्थान में "शून्य उपसर्ग" को बाध्य करने का अधिकार है।

XPath 2.0 आपको अपने XPath अभिव्यक्ति में अयोग्य नामों के लिए डिफ़ॉल्ट नामस्थान घोषित करने की अनुमति देता है, लेकिन इसका लाभ उठाने के लिए आपको एक एपीआई (जैसे सैक्सन एस 9पीआई) की आवश्यकता होगी जो इस सुविधा का लाभ उठाती है।

+0

अतिरिक्त जानकारी के लिए माइकल धन्यवाद। –

संबंधित मुद्दे