2013-05-24 6 views
16

क्या डोमोडोड पर xpath क्वेरी करने का कोई तरीका है? या कम से कम इसे DOMXPath में परिवर्तित करें?मैं डोमोडोड पर XPath क्वेरी कैसे करूं?

<html> 
    ... 
    <div id="content"> 
    ... 
    <div class="listing"> 
     ... 
     <div></div> 
     <div></div> 
     <div class='foo'> 
      <h3>Get me 1</h3> 
      <a>and me too 1</a> 
     </div> 
    </div> 
    <div class="listing"> 
     ... 
     <div></div> 
     <div></div> 
     <div class='foo'> 
      <h3>Get me 2</h3> 
      <a>and me too 1</a> 
     </div> 
    </div> 
    .... 
    </div> 
</html> 

यह मेरा कोड है। मैं सरणी की एक सूची प्राप्त करने की कोशिश कर रहा हूं जिसमें प्रत्येक सरणी में h3 के मान और टैग हैं। ऐसा करने के लिए, मुझे प्रत्येक लिस्टिंग प्राप्त करने की आवश्यकता थी, और फिर प्रत्येक लिस्टिंग में h3 और टैग का मान प्राप्त करें।

$html_dom = new DOMDocument(); 
@$html_dom->loadHTML($html); 
$x_path = new DOMXPath($html_dom); 

$nodes= $x_path->query("//div[@id='content']//div[@class='listing']"); 

foreach ($nodes as $node) 
{ 
    // I want to further dig down here using query on a DOMNode 
} 
+0

का उपयोग भी कर सकते हैं, जबकि किसी विशेष नोड से पूछना संभव है, आप क्लास foo के साथ सभी divs के लिए बस पूछ सकते हैं। या लिस्टिंग के अंतिम div बच्चे और मूल्यों को तुरंत प्राप्त करें। – Gordon

+0

मैं लिस्टिंग को पहले प्राप्त करने के बारे में सोच रहा था और उसके बाद मूल्यों को पूछता था ताकि मैं इसे उस संरचना में सरणी में आसानी से रख सकूं। लेकिन मुझे लगता है कि मैं सिर्फ एच 3 के परिणामों की अनुक्रमणिका से मेल खाता हूं और यदि मैं चाहता हूं। – arvinsim

उत्तर

26

करने के लिए DOMXPath::query

contextnode दूसरा तर्क के रूप में नोड दर्रा: वैकल्पिक contextnode रिश्तेदार XPath प्रश्नों करने के लिए निर्दिष्ट किया जा सकता। डिफ़ॉल्ट रूप से, प्रश्न मूल तत्व के सापेक्ष हैं।

उदाहरण:

foreach ($nodes as $node) { 
    foreach ($x_path->query('h3|a', $node) as $child) { 
     echo $child->nodeValue, PHP_EOL; 
    } 
} 

यह

Get me 1 
and me too 1 
Get me 2 
and me too 1 

का एक परिणाम के लिए UNION operator का उपयोग करता है कि आप किसी भी जटिल क्वेरी किए जाने की जरूरत नहीं है, तो आप भी ऐसा कर सकते हैं

foreach ($nodes as $node) { 
    foreach ($node->getElementsByTagName('a') as $a) { 
     echo $a->nodeValue, PHP_EOL; 
    } 
} 

या यहां तक ​​कि बच्चे नोड्स को पुन: स्थापित करके (ध्यान दें कि यह मैं हूं ncludes सभी पाठ नोड्स)

foreach ($nodes as $node) { 
    foreach ($node->childNodes as $child) { 
     echo $child->nodeName, PHP_EOL; 
    } 
} 

हालांकि, उस के सभी अनावश्यक है, क्योंकि इन नोड्स सीधे लाने कर सकते हैं:

$nodes= $x_path->query("/html/body//div[@class='listing']/div[last()]"); 

foreach ($nodes as $i => $node) { 
    echo $i, $node->nodeValue, PHP_EOL; 
} 

के साथ सभी divs के अंतिम div बच्चे में आप दो नोड्स दे देंगे सूची और उत्पादन संयुक्त पाठ नोड मूल्यों के एक वर्ग विशेषता मान, सहित खाली स्थान के

0 
      Get me 1 
      and me too 1 

1 
      Get me 2 
      and me too 1 

इसी तरह, निम्नलिखित

"//div[@class='listing']/div[last()]/node()[name() = 'h3' or name() = 'a']" 

आप चार बच्चे H3 और एक नोड्स और उत्पादन

0Get me 1 
1and me too 1 
2Get me 2 
3and me too 1 

दे देंगे आप उन पर पुनरावृत्ति करते हुए, आप

foreach ($nodes as $i => $node) { 
    echo $i, $node->nodeName, $node->nodeValue, PHP_EOL; 
} 

कर सकते हैं नाम से इन अलग करने के लिए की जरूरत है जो तब होगा

0h3Get me 1 
1aand me too 1 
2h3Get me 2 
3aand me too 1 
+0

क्या होगा यदि वह एच 3 और एक अलग चर में स्टोर करना चाहता था तो इस तरह कुछ http://stackoverflow.com/questions/43131400/xpath-query-get-child-nodes-in-a-parent-node-using-a- पाश – DragonFire

5

अपने $node को संदर्भ नोड के रूप में प्रदान करें।

foreach ($nodes as $node) 
{ 
    $morenodes = $x_path->query(".//h3", $node); 
} 

के मैनुअल में $contextnode देखें: http://php.net/manual/en/domxpath.query.php

+0

जब मैंने यह समाधान किया, तो मुझे नतीजे मिलने पर एक ही परिणाम मिलते हैं ... मैं पहली लिस्टिंग के लिए मान प्राप्त करता हूं – arvinsim

+0

आप जिस एक्सपैथ क्वेरी का उपयोग कर रहे हैं? संपादित करें: लूप के अंदर है। – EPB

+3

मैं आगे बढ़ गया और एक उदाहरण क्वेरी के साथ संपादित किया जिसका मैंने शुरुआत में अपने उत्तर का परीक्षण करने के लिए उपयोग किया था। '.' से शुरू करना महत्वपूर्ण है यदि आप क्वेरी शुरू करने के लिए' // 'का उपयोग करने की योजना बनाते हैं, जो स्पष्ट रूप से रूट के सापेक्ष हमेशा होता है। – EPB

1

बस इसे पूरा करने के लिए,हैविधि जो उस नोड के xpath देता है।तो आप $x_path->query($node->getNodePath().'//h3')

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