2012-09-04 113 views
1

給定的HTML文檔包含這樣一種形式:如何使用XPath從HTML文檔中提取屬性對?

<form> 
    <div controlType="yyy1" xmlTag="zzz1">...</div> 
    <div controlType="yyy2" xmlTag="zzz2">...</div> 
</form> 

我需要收集這樣的數據:

$div[0]  = array('yyy1', 'zzz1'); 
$div[1]  = array('yyy2', 'zzz2'); 

所需對屬性是每個div元件controlTypexmlTag

回答

1

評估這兩個XPath表達式

/form/div[$k]/@controlType 

和:

/form/div[$k]/@xmlTag 

填充$div[$k -1]

其中$k必須與數字,1,2取代,.. 。,count(/form/div)

一個可能會傾向於兩個表達式以上組合成單個XPath表達式:

/form/div[$k]/@* 

然而的XPath的實現被允許以任何順序返回的屬性(XPath不限定排序之中的屬性)和兩個屬性中的哪一個在選定節點中首先出現並且其次是第二個。

0

我的兩分錢,如果它有助於@ dimitre-novatchev基於優秀的想法建議

  var doc = '<form xmltag="xxx"><div controltype="yyy1" xmltag="zzz1">...</div><div controltype="yyy2" xmltag="zzz2">...</div></form>'; 

     var result = []; 

     $(doc).children().each(function() { 
      var ctrl = $(this); 
      if (ctrl.is('div')) { 
       result.push([ctrl.attr('controlType'), ctrl.attr('xmlTag')]); 
      } 
     }); 
+0

你是認真的嗎?我問一個基於PHP的解決方案,而不是JavaScript!任何方式看起來不錯。 –

0
@$url = "http://XXX.xom" 
$path  = "//div[@class='sb_tlst']//a"; 
$contents = get_contents($url, $path); 
foreach ($contents as $value) 
{ 
    /* do something */ 
} 
0

我的最終解決方案:

$res    = $xpath->query("//form//div/@xmltag"); // OBS: xmltag not xmlTag 
$total_fields = $res->length; 

for ($i = 1; $i <= $total_fields; $i ++) 
{ 
    $r  = $xpath->query("//form//div[$i]/@xmltag"); 
    $xmltag = $r->item(0)->value; 

    $r   = $xpath->query("//form//div[$i]/@controltype"); 
    $controltype = $r->item(0)->value; 

    $div[$i - 1] = array(
     'xmltag'   => $xmltag, 
     'controltype' => $controltype 
    ); 
} 

輸出樣本:

array (
    0 => 
    array (
    'xmltag' => 'Case_Number', 
    'controltype' => '', 
), 
    1 => 
    array (
    'xmltag' => 'Plaintiff', 
    'controltype' => 'RadioButtons', 
), 
    2 => 
    array (
    'xmltag' => 'Plaintiff_Name', 
    'controltype' => '', 
), 

美麗!

相關問題