2011-11-19 13 views
8

another question के लिए मैंने कुछ XML संबंधित कोड बनाया है जो मेरी विकास मशीन पर काम करता है लेकिन वाइपर कोडपैड पर नहीं, जहां मैंने इसे अपने उत्तर में जोड़ने से पहले परीक्षण किया था।XPath क्वेरी परिणाम आदेश

मैं अपनी समस्या को इस बिंदु पर कम कर सकता हूं कि DOMXPath::query() द्वारा लौटाए गए नोड्स का क्रम मेरे सिस्टम और कोडेपैड के बीच अलग है।

एक्सएमएल: <test>This is some <span>text</span>, fine.</test>

जब मैं सभी textnodes क्वेरी //child::text() परिणाम भिन्न होता है:

Viper Codepad:

#0: This is some 
#1: , fine. 
#2: text 

मेरे मशीन:

#0: This is some 
#1: text 
#2: , fine. 

मैं xpath के साथ अनुभव नहीं कर रहा हूं कि मुझे समझ में आता है कि ऐसा क्यों होता है और PHP कार्यान्वयन के साथ रिटर्न ऑर्डर को प्रभावित करना संभवतः संभव है।

संपादित करें:

आगे परीक्षण से पता चला है कि LIBXML_VERSION दो प्रणालियों के बीच अंतर होता है:

Viper Codepad: 20626 (2.6.26; 6 Jun 2006) 
My Machine...: 20707 (2.7.7; 15 Mar 2010) 

उत्तर

4

मुझे निम्न बग-रिपोर्ट मिल सकती है जो इस तरह दिखती है: Bug 363252 - proximity position in libxml2's xmlXPathEvalExpression() ने 18 अक्टूबर 2006 को रिपोर्ट की और मई 2006 के बाद से डेटिंग की पुष्टि की जो प्रश्न में 2.6.26 संस्करण से पहले है।

यह libxml2 2.6.27 में तय किया जाना चाहिए था।

+1

+1 - धन्यवाद, यह मुझे सही और सूचनात्मक उत्तर के लिए समय – Vitaliy

2

यह 20,626 संस्करण में एक बग की तरह दिखता है:

यह पहली बार सभी चाइल्ड पाठ की प्रक्रिया दस्तावेज़ ऑर्डर में नोड्स, फिर बाल तत्व नोड्स की सामग्री। परिणामस्वरूप आपकी मशीन

+1

हालांकि ओकम के मुताबिक यह सबसे अधिक संभावित स्पष्टीकरण है, फिर भी यह सत्यापित करने के लिए libxml चेंजलॉग में एक बग रिपोर्ट या संकेतक होना चाहिए। – Gordon

+0

आप उस जानकारी को कहां से प्राप्त किया? यदि आप कर सकते हैं, तो कृपया कुछ आधिकारिक संसाधनों के लिए एक लिंक जोड़ें। – hakre

+0

यह केवल मेरी धारणा थी कि यह एक मुद्दा है - क्योंकि xpath गलत नोड्स ऑर्डर में परिणाम देता है। वर्तमान में मुझे केवल [यह] मिला है (http://mail.gnome.org/archives/xml/2008-November/msg00112.html), लेकिन यह असंबंधित है। और शायद [यह] (http://mail.gnome.org/archives/xml/2005-May/msg00035.html) – Vitaliy

1

ऐसा प्रतीत होता है कि वाइपर कोडेपैड पहले 0 ऑर्डर में चयनित text() नोड्स को वापस नहीं कर रहा है, लेकिन पहले चौड़ाई का मूल्यांकन कर रहा है।

यह पहली बार एक गहराई होने वाला माना जाता है।

सैक्सन, एमएसएक्सएमएल, अल्टोवा एक्सएमएल प्रत्येक ने परिणामों को गहराई से पहले क्रम में वापस कर दिया।

2

XPath एक क्वेरी भाषा है, इस प्रकार इसे केवल .xml दस्तावेज़ की संरचना को पढ़ना चाहिए और इसे कभी भी संशोधित नहीं करना चाहिए। इसमें नोड ऑर्डर शामिल है। आपके पहले उदाहरण में हालांकि यह सच नहीं है। तो यह निश्चित रूप से this के अनुसार एक बग है।

+0

हाँ, मैं यही सोचता हूं, या कम से कम मैं xpath परिभाषा में * दस्तावेज़ ऑर्डर * शब्द को कैसे समझता हूं। – hakre

7

तकनीकी रूप से XPath 1.0 नोड अनुक्रमों के बजाय नोड-सेट देता है। XPath 1.0 विनिर्देश में इन नोड-सेट के क्रम के बारे में कोई बयान नहीं है - वास्तव में, सेट होने के कारण, उनके पास कोई आंतरिक आदेश नहीं है।

हालांकि, एक्सएसएलटी 1.0 हमेशा दस्तावेज़ क्रम में XPath 1.0 द्वारा लौटाए गए नोड-सेट को संसाधित करता है, और उस उदाहरण के कारण, एक व्यापक उम्मीद है कि XPath परिणाम दस्तावेज़ क्रम में होंगे जब XPath XSLT के अलावा अन्य भाषाओं से आक्रमण किया जाता है । हालांकि, इस गारंटी के लिए कल्पना में कुछ भी नहीं है। XPath 2 में।0 उपयोगकर्ता अपेक्षा spec का हिस्सा बन जाती है, और पथ अभिव्यक्ति के परिणाम दस्तावेज़ क्रम में होना चाहिए।

+0

+1 बचाया। –

+0

libxml2 डिज़ाइन द्वारा सम्मेलन का पालन करता है ताकि दस्तावेज़ ऑर्डर में हमेशा वापस आ सकें। उदाहरण के लिए विशेषताओं के लिए भी, जिनके पास ऑर्डर करने की आवश्यकता नहीं है। – hakre

+1

@ माइकल Kay: भविष्यवाणी के साथ आदेश के बारे में क्या? XPath 1.0 निर्दिष्ट नहीं करता है कि नोड-सेट दस्तावेज़ ऑर्डर में हैं? http://www.w3.org/TR/xpath/#predicates – hakre

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