2010-01-15 11 views
8

किसी HTML दस्तावेज़ में सभी DOM नोड्स को विशिष्ट रूप से पहचानने का तरीका क्या है। मेरा मतलब यह समझाने के लिए, यहां एक (काल्पनिक) उदाहरण है:डीओएम नोड की विशिष्ट पहचान करने का सबसे अच्छा तरीका क्या है?

  • स्क्रिप्ट एक्स यादृच्छिक रूप से document.html से एक डोम नोड का चयन करता है।
  • स्क्रिप्ट एक्स को स्क्रिप्ट वाई को बताने की ज़रूरत है जो डीओएम नोड ने चुना है।
  • स्क्रिप्ट एक्स विशिष्ट रूप से डीओएम नोड को कैसे पहचानता है ताकि स्क्रिप्ट वाई जानता है कि यह document.html में कौन सा नोड है?

मुझे वास्तव में दिलचस्पी है कि डीओएम नोड की विशिष्ट पहचान कैसे करें ताकि स्क्रिप्ट वाई इसे पहचान सके और इसे कुशल बना सके। अधिमानतः, इसे टेक्स्ट नोड्स के साथ भी काम करना चाहिए। मैं शायद XPath के बारे में सोच रहा था, लेकिन मुझे यकीन नहीं है कि किसी भी दिए गए नोड को अद्वितीय XPath कैसे उत्पन्न करें।

उत्तर

6

आप रूट नोड के लिए नोड से पीछे की ओर काम कर रहा है, और नोड पर आप हैं, पर नज़र रखने से एक अनूठा XPath निर्धारित करने में सक्षम होना चाहिए, और जो भाई-बहन भी है, ऐसा है कि आप की तरह कुछ मिलता है:

/a[1]/b[2]/c[101]/text() 

ताकि, दूसरा B नोड के अंतर्गत 101 C नोड, आदि है जैसे कि एक अद्वितीय पथ है और चारों ओर संदर्भ के साथ XPath अक्ष मूल दस्तावेज़ को

+0

क्या होगा यदि कोई स्क्रिप्ट जेड है जो डोम को भी कुशल बनाता है? – tback

+0

अधिकांश भाषाओं में एक्सपैथ कार्यान्वयन उपलब्ध हैं। कमांड लाइन पर आप xmlstarlet (केवल इसके लिए Google) नामक कमांड-लाइन टूल का उपयोग कर सकते हैं –

+0

बिल्कुल वही जो मैं ढूंढ रहा था! क्या होगा यदि मेरा कोड इस तरह दिखता है:

hello dear world

। मैं "दुनिया" नोड की पहचान कैसे कर सकता हूं। क्या मैं ऐसा कुछ करूंगा?/div [0]/पी [0]/पाठ [1]? –

0

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

+0

ठीक है लेकिन मैं इसे विपरीत में कर रहा हूं: मुझे पता है कि मैं किस नोड पर हूं लेकिन वहां कैसे नहीं जाना है;) ब्रायन का जवाब काफी अच्छा लगता है। –

0

क्रमसंख्या बच्चे पदों कॉपी किया जा सकता। नोड्स दृढ़ता से आदेश दिया जाता है, और इतना कह रही: बच्चे 5.

के बच्चे 4 बच्चे 3 की

बच्चे 1 यह करना चाहिए।

1

आप XPathGen https://github.com/amouat/XPathGen

पर एक नज़र लेने के लिए यह एक दिया डोम नोड के लिए प्रपत्र /node()[1]/node()[1] का एक अनूठा XPath पैदा करेगा चाहते हो सकता है। हालांकि, XPath के साथ कुछ समस्याएं हैं, अर्थात् गैर-कोलेस्ड टेक्स्ट नोड्स और "प्रोलॉग" नोड्स, जिन्हें विशिष्ट रूप से XPath के साथ पूरी तरह से पहचाना नहीं जा सकता है। उदाहरण के लिए आप डोम में निम्नलिखित दस्तावेज़ है, तो:

<a>b</a> 

और एक पाठ नोड जोड़ते बनने के लिए:

<a>bc</a> 

XPath ख नोड्स और ग होगा ही, लेकिन आप अभी भी होगा अलग डोम नोड्स (जब तक कि आप दस्तावेज़ पर सामान्यीकृत नहीं करते)। यदि आपको इस स्थिति को संभालने की आवश्यकता है तो आपको टेक्स्ट नोड्स के लिए ऑफ़सेट और लम्बाई स्टोर करने की आवश्यकता होगी।

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

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