2011-08-14 10 views
13

किसी XML दस्तावेज़ में कुछ नोड्स में नामस्थान हैं, जो परिभाषित उपसर्ग के साथ निर्दिष्ट हैं।नेमस्पेस-योग्य नोड्स के लिए कोई XPath वाक्यविन्यास क्यों नहीं है?

यह XPath 1.0 में स्थानीय नाम() निर्दिष्ट और इतने नामस्थान अनदेखी करने के लिए संभव है।

हालांकि, मैं XPath के लेखक को अपने पूर्ण नेमस्पेस-योग्य नाम का उपयोग पहचानकर्ता के रूप में नोड ढूंढने के लिए सक्षम करना चाहता हूं।

अनुशंसित तरीका आवेदक कोड (मेरे मामले में, जावा) में नेमस्पेस घोषणाओं को जोड़ना है। लेकिन इसका मतलब है कि एक्सपैथ लिखने वाले व्यक्ति के पास नामस्थानों के साथ काम करने की क्षमता नहीं है!

शुद्ध XPath का उपयोग करके हम अपने पूर्ण योग्य नामों से नोड्स कैसे प्राप्त करते हैं?

+2

यदि मैं सही तरीके से प्रश्न समझता हूं, तो आप पूछ रहे हैं कि 'एडनामस्पेस ("एबीसी", "http://example.com") जैसे निर्देश का उपयोग करके नामस्थान घोषित करने की आवश्यकता क्यों है, जो तब करने की अनुमति देता है Xpath क्वेरी '/ abc: node' की तरह, किसी भी तरह से क्वेरी में सीधे' http: // example.com' का उपयोग करके। क्या मैंने सवाल सही तरीके से व्याख्या किया है? –

+1

@ जोंग बोर हाँ, यही वह है। एपीसी = http: //example.com को XPath के भीतर किसी भी तरह घोषित करने के बाद XPath क्वेरी में सीधे उपसर्ग एबीसी का उपयोग करना अच्छा होगा। मैं समझता हूं कि XPath अभिव्यक्तियां कम हैं और इसमें परिभाषाओं को सम्मिलित करना सामान्य नहीं होगा, लेकिन XPath में संभव होने से तकनीकी रूप से कुछ भी नहीं रोक रहा है। –

+1

बीटीडब्ल्यू अच्छा सवाल, +1। चूंकि उपसर्गों को केवल महत्वहीन वाक्य रचनात्मक चीनी माना जाता है, जबकि नामस्थान यूआरआई महत्वपूर्ण हैं, तो आपको लगता है कि यह नोड नाम पर मिलान करने के लिए उपयोगी हो सकता है, उपसर्ग के साथ गड़बड़ किए बिना नामस्थान यूआरआई हैं - खासकर अगर XPath स्वयं प्रदान करता है एक उपसर्ग घोषित करने का कोई तरीका नहीं है। – LarsH

उत्तर

13

सुनिश्चित नहीं है कि "पहचानकर्ता के रूप में" का क्या अर्थ है।

शुद्ध XPath का उपयोग करके हम अपने पूर्ण योग्य नामों से नोड्स कैसे प्राप्त करते हैं?

स्थानीय नाम() और namespace-uri() का उपयोग करके XPath 1.0 में, उदा।

"*[local-name() = 'foo' and namespace-uri() = 'http://my.org/ns/2.0']" 

XPath 2.0 में, नामस्थान से संबंधित कार्यों का एक समृद्ध सेट है, उदा। namespace-uri-from-QName()। लेकिन मुझे यकीन नहीं है कि वे उपरोक्त में जो चाहते हैं उसके लिए सुधार करते हैं।

+1

अच्छा, यह समझ में आता है। थोड़ा बेकार - मैं इन फ़ंक्शन नामों के बिना http://my.org/ns/2.0|foo की तरह कुछ लिखूंगा, और किसी भी तरह से उपसर्ग का उपयोग करने के लिए बेहतर होगा, उन्हें जावा की बजाय XPath में घोषित करना होगा - लेकिन यह आवश्यकता को पूरा करता है। –

+1

"अपने पूर्ण नामस्थान-योग्य नाम को पहचानकर्ता के रूप में उपयोग करके" मेरा मतलब था कि आपको नेमस्पेस + स्थानीय-नाम के साथ ठीक से नोड्स को संदर्भित करने में सक्षम होना चाहिए। आपका जवाब दिखाता है कि कैसे। –

+0

@ जोशुआफॉक्स: मैं मानता हूं, XPath में उपसर्गों को घोषित करने में सक्षम होना बहुत आसान होगा। मुझे कल्पना है कि कुछ कारण हैं कि "उन्होंने" ने XPath में शामिल न करने का निर्णय लिया, लेकिन यह एक बड़ा अंतर की तरह प्रतीत होता है, क्योंकि कामकाज इतना वर्बोज़ है। – LarsH

1

आप अपने XPath प्रश्नों के दौरान नामस्थान का उपयोग कर सकते हैं। जावा में, आपको जो प्रदान करने की आवश्यकता है वह NamespaceContext का कार्यान्वयन है यदि आप हर समय पूरी तरह से योग्य नामस्थान के बजाय उन प्रश्नों में उपसर्ग का उपयोग करना चाहते हैं। बस अपने XPath पर NamespaceContext का एक उदाहरण जोड़ें - मुझे लगता है कि आप मानक जेडीके कार्यान्वयन का उपयोग करेंगे - लेकिन अवधारणा जैक्सन या अन्य लोगों के लिए भी लागू है।

फिर आप //customns:Element जैसे प्रश्नों को निष्पादित कर सकते हैं।

आप या एक NamespaceContext तो एकमात्र समाधान local-name और namespace-uri फ़ंक्शन का उपयोग किया जा रहा है (जो भी कारण के लिए) का उपयोग कर सकते नहीं है, तो नहीं:

Document doc = ...; 
XPath xp = XPathFactory.newInstance().newXPath(); 
String name = "Element"; 
String ns = "http://www.custom.org/#"; 
String expr = "//*[local-name() = '"+name+" and namespace-uri() = '"+ns+"']"; 
Node node = ((NodeList)xp.evaluate(expr, doc, XPathConstants.NODESET)).item(0); 
+1

धन्यवाद। क्या होगा यदि मैं पूर्ण नामस्थान नामों का उपयोग करने के लिए तैयार हूं और उपसर्ग नहीं? दूसरे शब्दों में, कुछ पसंद है। क्या मैं जावा में नेमस्पेस घोषित करने से बच सकता हूं? मेरा लक्ष्य बाहरी स्रोत से XPath अभिव्यक्तियों में पढ़ना है, और इसलिए मुझे इसे अलग से निर्दिष्ट नहीं करना होगा। –

+0

यह इस बात पर निर्भर करता है कि स्रोत कैसा दिखता है - यदि आपके पास सिर्फ एक अभिव्यक्ति // abc है: तत्व और कोई नेमस्पेस घोषणा नहीं तो सिद्धांत में आप अटक गए हैं - यह जानने का कोई तरीका नहीं है कि एबीसी अंक क्या है। लेकिन अगर आप पूरी तरह से सुनिश्चित हो सकते हैं कि उन बाहरी अभिव्यक्तियों के आपके कामकाजी दस्तावेज़ की तुलना में वही उपसर्ग हैं, तो आप अभी भी अपने दस्तावेज़ में संबंधित नामस्थान देख सकते हैं और फिर या तो नामस्थान कॉन्टेक्स्ट बना सकते हैं या इसका उपयोग नहीं कर सकते हैं। मैं अपना जवाब बताऊंगा कि ऐसा कैसे करें। – emboss

+0

दुर्भाग्यवश, स्थानीय नाम() और नेमस्पेस-यूरी() के संयोजन से [कोई अन्य समाधान] नहीं है (http://www.jguru.com/forums/view.jsp?EID=1073634)। – emboss

4

XPath 3.0 है, जो काम करने में वर्तमान में है मसौदा की स्थिति में URI qualified QNames के लिए एक शाब्दिक अभिव्यक्ति शामिल होगी जो सीधे नामस्थान यूरी निर्दिष्ट करने की अनुमति देगी।

यहाँ EQNames के कुछ उदाहरण हैं:

  • अनुकरणीय एक namespace उपसर्ग के बिना एक शाब्दिक QName है।
  • गणित: पीआई एक नामस्थान उपसर्ग के साथ एक व्याख्यात्मक QName है।
  • "http://www.w3.org/2005/xpath-functions/math":pi नामांकित यूआरआई को URILiteral का उपयोग करके निर्दिष्ट करता है; यह एक व्याख्यात्मक QName नहीं है।

मैं Saxon 9.3 जो जावा एपीआई के माध्यम से प्रयोग करने योग्य होना चाहिए xpath 3.0 के एक पूर्वावलोकन कार्यान्वयन भी शामिल है।

+3

सही, हालांकि 3.0 विशेषताएं वर्तमान में केवल उत्पाद के वाणिज्यिक संस्करणों में सक्षम हो सकती हैं। जैसे प्रश्न "इस संस्करण को पिछले संस्करणों में क्यों नहीं था" जवाब देना हमेशा मुश्किल होता है - या तो कोई भी इसका प्रस्ताव नहीं करता है या उन्होंने पर्याप्त कठोर दबाव नहीं डाला है, या उन्हें एक ही समस्या को हल करने के लिए प्रतिद्वंद्वी प्रस्तावों के साथ प्रतिस्पर्धा करना पड़ा है। –

0

XPath 3.0 के लिए कल्पना का कहना है:

Q{http://www.w3.org/2005/xpath-functions/math}pi 
मौजूद-DB में उदाहरण के लिए

यह इस समय काम करता है (अक्टूबर 2015)।

+0

@ ई 4 सी 5: एक्सएमएल अपने शाब्दिक वाक्यविन्यास में चीजों के लिए यूआरआई का उपयोग करना पसंद करता है। आपको जवाब को और सावधानीपूर्वक पढ़ना चाहिए था। –

+0

@NathanTuggy हाँ आप सही हैं, जबकि मॉडरेटिंग केवल एक लिंक के रूप में दिखाई देती है (टिप्पणी सिस्टम द्वारा ऑटो डाली जाती है) मैंने अब उस टिप्पणी को हटा दिया है। – e4c5

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