2009-12-30 10 views
55

इस XML को देखते हुए:XPath का उपयोग करके, मैं अपनी टेक्स्ट सामग्री और विशेषता के मूल्य के आधार पर नोड का चयन कैसे करूं?

<DocText> 
<WithQuads> 
    <Page pageNumber="3"> 
     <Word> 
      July 
      <Quad> 
       <P1 X="84" Y="711.25" /> 
       <P2 X="102.062" Y="711.25" /> 
       <P3 X="102.062" Y="723.658" /> 
       <P4 X="84.0" Y="723.658" /> 
      </Quad> 
     </Word> 
     <Word> 
     </Word> 
     <Word> 
      30, 
      <Quad> 
       <P1 X="104.812" Y="711.25" /> 
       <P2 X="118.562" Y="711.25" /> 
       <P3 X="118.562" Y="723.658" /> 
       <P4 X="104.812" Y="723.658" /> 
      </Quad> 
     </Word> 
    </Page> 
</WithQuads> 

मैं नोड्स इस मामले में 'जुलाई' और एक Quad/P1/एक्स गुण इस प्रकार 90 से अधिक, के पाठ है कि प्राप्त करना चाहते हैं, यह किसी भी मैच वापस नहीं करना चाहिए। हालांकि, अगर मैं जीटी (>) या एलटी (<) का उपयोग करता हूं, तो मुझे पहले शब्द तत्व पर एक मैच मिलता है। अगर मैं eq (=) का उपयोग करता हूं, तो मुझे कोई मिलान नहीं मिलता है।

तो:

//Word[text()='July' and //P1[@X < 90]] 

सच वापस आ जाएगी,

//Word[text()='July' and //P1[@X > 90]] 

मैं कैसे पी 1 @ एक्स विशेषता पर ठीक से इस विवश है के रूप में?

इसके अलावा, कल्पना करें कि मेरे पास अलग-अलग पेज नंबरों के लिए एकाधिक पृष्ठ तत्व हैं। मैं text()='July', [email protected] < 90 के साथ नोड्स को खोजने के लिए उपरोक्त खोज को अतिरिक्त रूप से कैसे रोकूं, और पृष्ठ @pageNumber=3?

+0

इस विशेष XML के साथ नोट करना एक महत्वपूर्ण बात है जो प्रत्येक पाठक के लिए स्पष्ट नहीं हो सकता है, क्योंकि यह XML एक मिश्रित सामग्री मॉडल का उपयोग करता है, यह मुश्किल है XPath के साथ तत्वों का मिलान करें। मैं हाल ही में इस मुद्दे में भाग गया और, मेरे XPath के साथ जंगली होने के नाते, यह निष्कर्ष निकालने वाला था कि जब तक मुझे माइकल के उत्तर का जवाब नहीं मिला तब तक मिश्रित सामग्री तत्वों से मेल नहीं खा सकता था। मैं मिश्रित सामग्री और XPath के साथ नुकसान के बारे में बात करने वाले किसी अन्य संदर्भ को नहीं ढूंढ पाया। –

+0

आपके प्रश्न ने मेरे प्रश्न का उत्तर दिया। XPath में तारों के लिए 'एकल apostrophes' का उपयोग करना बहुत महत्वपूर्ण है, न कि "डबल उद्धरण चिह्न"। यह वास्तव में बहुत महत्वपूर्ण है। सुराग के लिए धन्यवाद। –

उत्तर

66

आम तौर पर मैं एक अपरिक्स्ड // के उपयोग को XPath में खराब गंध के रूप में उपयोग करने पर विचार करता हूं।

इस प्रयास करें: -

/DocText/WithQuads/Page/Word[text()='July' and Quad/P1/@X > 90] 

आपकी समस्या यह है कि आप //P1[@X < 90] जो दस्तावेज़ की शुरुआत में वापस शुरू होता है और किसी भी P1 शिकार इसलिए यह हमेशा सच हो जाएगा शुरू होता है का उपयोग करें। इसी तरह //P1[@X > 90] हमेशा सत्य है।

+1

मुझे आश्चर्य है कि वास्तव में, माइकल के जवाब में संबोधित व्हाइटस्पेस मुद्दों के कारण यह वास्तव में काम करता था। मैंने इस जवाब को दो अलग-अलग XPath मूल्यांकनकर्ताओं में करने की कोशिश की और यह किसी भी के साथ मेल नहीं खाता। एक बार जब मैं 'सामान्यीकृत-स्थान' के साथ भविष्यवाणी करता हूं, तो मैंने एक सफल मैच बनाया। –

23

"//" समस्या के अलावा, यह एक्सएमएल मिश्रित सामग्री का एक बहुत ही अजीब उपयोग है। भविष्यवाणी text()='July' तत्व से मेल खाएगी यदि कोई भी बच्चा टेक्स्ट नोड जुलाई के बराबर है, जो आस-पास के व्हाइटस्पेस के कारण आपके उदाहरण में सत्य नहीं है। स्रोत एक्सएमएल की सटीक परिभाषा के आधार पर, मैं [text()[normalize-space(.)='July'] and Quad/P1/@X > 90]

+0

धन्यवाद, माइकल। मैं व्हाइटस्पेस के बारे में सोच रहा था .... मैंने स्टैक ओवरफ़्लो में पेस्ट करने से पहले नमूना स्वरूपित किया, लेकिन मेरा स्रोत एक्सएमएल सभी "तंग" है। जब मैं स्वरूपित संस्करण के खिलाफ xpath चला गया तो यह वास्तव में सही ढंग से काम करने में विफल रहा था। मैं सामान्यीकृत-स्थान (।) का उपयोग करने का प्रयास करूंगा –

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