2012-01-10 11 views
6

के साथ टाइप करें मैं Body तत्व पर xsi:type विशेषता के मान को वापस करने के लिए सही XPath अभिव्यक्ति निर्धारित करने का प्रयास कर रहा हूं। मैंने भाग्य के बिना सबकुछ की तरह क्या कोशिश की है। जो मैंने पढ़ा है उसके आधार पर यह करीब प्रतीत होता है लेकिन यह स्पष्ट रूप से सही नहीं है। कोई त्वरित मार्गदर्शन ताकि मैं अंत में आराम कर सकूं?xsi का मान प्राप्त करें: xpath

//v20:Body/@xsi:type 

मैं इसे वापस करने के लिए v20:SmsMessageV1RequestBody

<v20:MessageV1Request> 
    <v20:Header> 
     <v20:Source> 
      <v20:Name>SOURCE_APP</v20:Name> 
      <v20:ReferenceId>1326236916621</v20:ReferenceId> 
      <v20:Principal>2001</v20:Principal> 
     </v20:Source> 
    </v20:Header> 
    <v20:Body xsi:type="v20:SmsMessageV1RequestBody"> 
     <v20:ToAddress>5555551212</v20:ToAddress> 
     <v20:FromAddress>11111</v20:FromAddress> 
     <v20:Message>TEST</v20:Message> 
    </v20:Body> 
</v20:MessageV1Request> 
+4

एक्सपैथ अभिव्यक्ति मेरे लिए अच्छा लगती है। क्या आप इस XPath को XQUERY, XSLT या कुछ और में उपयोग कर रहे हैं? यहां किसी समस्या का सबसे संभावित कारण नामस्थान उपसर्गों के कारण भ्रम है। भ्रम के स्रोत के रूप में नेमस्पेस को खत्म करने का एक तरीका है xpath को फिर से लिखना: // * [स्थानीय-नाम() eq 'body']/@ * [स्थानीय-नाम() eq 'type'] –

+0

मरे सही है , क्योंकि XPath में नामस्थानों से निपटने के लिए आम तौर पर दो तरीके होते हैं - पहले: 'स्थानीय-नाम()' और 'नेमस्पेस-यूरी()' XPath फ़ंक्शन का उपयोग करके, दूसरा: XPath इंजन के उचित तंत्र का उपयोग करना - उदाहरण के लिए मानक जेएक्सपी के लिए आपको उचित रूप से कॉन्फ़िगर किए गए नेमस्पेस कॉन्टेक्स्ट का उपयोग करना होगा जो नामस्थानों के उपसर्गों को मानचित्र करता है। –

उत्तर

2

के रूप में टिप्पणी में बताया गया हैं, तो आप दो विकल्प हैं:

  1. उपयोग local-name() नामस्थान के लिए संबंध के बिना लक्ष्य नोड्स संदर्भ के लिए
  2. XPath इंजन
  3. के साथ सभी नामस्थानों को उचित रूप से पंजीकृत करें

    XPath xpath = XPathFactory.newInstance().newXPath(); 
    NamespaceContext ctx = new NamespaceContext() { 
        public String getNamespaceURI(String prefix) { 
         if ("v20".equals(prefix)) { 
          return "testNS1"; 
         } else if ("xsi".equals(prefix)) { 
          return "http://www.w3.org/2001/XMLSchema-instance"; 
         } 
         return null; 
        } 
        public String getPrefix(String uri) { 
         throw new UnsupportedOperationException(); 
        } 
        public Iterator getPrefixes(String uri) { 
         throw new UnsupportedOperationException(); 
        } 
    }; 
    xpath.setNamespaceContext(ctx); 
    XPathExpression expr = xpath.compile("//v20:Body/@xsi:type");  
    System.out.println(expr.evaluate(doc, XPathConstants.STRING)); 
    

    ध्यान दें कि मैं निम्नलिखित नाम स्थान घोषणाओं संभालने कर रहा हूँ:

    <v20:MessageV1Request xmlns:v20="testNS1" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    

    वास्तविक उपयोग करने के लिए आप getNamespaceURI अपडेट करना होगा

यहाँ कैसे जावा में बाद करना है मान।

0

सभी महान उत्तरों/प्रतिक्रिया। मेरा वास्तविक मुद्दा लगता है कि सुबह में एक रात दूर और ताजा निर्माण के साथ खुद को हल कर लिया है। मैं प्रतिक्रिया के साथ बढ़ रहा हूँ। सबको शुक्रीया।

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