PHP DOM öğelerini erişen yardıma ihtiyacım var

1 Cevap php

Hey guys, ben bilgi çekmeye çalışıyorum şu HTML yapıya sahiptir:

// Product 1
<div class="productName">
 <span id="product-name-1">Product Name 1</span>
</div>

<div class="productDetail">            
 <span class="warehouse">Warehouse 1, ACT</span>                
 <span class="quantityInStock">25</span>
</div>

// Product 2
<div class="productName">
 <span id="product-name-2">Product Name 2</span>
</div>

<div class="productDetail">            
 <span class="warehouse">Warehouse 2, ACT</span>                
 <span class="quantityInStock">25</span>
</div>

…

// Product X
<div class="productName">
 <span id="product-name-X">Product Name X</span>
</div>

<div class="productDetail">            
 <span class="warehouse">Warehouse X, ACT</span>                
 <span class="quantityInStock">25</span>
</div>

Ben kaynak html kontrolü yoktur ve ÜrünAdı görürsünüz ve ProductDetail eşlik eden ortak bir öğesi içinde yer değildir.

Şimdi, ben sayfasını denemek ve ayrıştırmak için aşağıdaki php kodu kullanıyorum.

$html = new DOMDocument();
$html->loadHtmlFile('product_test.html');

$xPath = new DOMXPath($html);

$domQuery = '//div[@class="productName"]|//div[@class="productDetail"]';

$entries = $xPath->query($domQuery);

foreach ($entries as $entry) { 
 echo "Detail: " . $entry->nodeValue) . "<br />\n";
}

Hangi aşağıdaki yazdırır:

Detail: Product Name 1
Detail: Warehouse 1, ACT
Detail: 25
Detail: Product Name 2
Detail: Warehouse 2, ACT
Detail: 25
Detail: Product Name X
Detail: Warehouse X, ACT
Detail: 25

Şimdi, bu ne istediğiniz yakındır. Ama ben her ürün, Depo ve miktar stoku üzerinde bazı işlemleri yapmak ve ayrı ürün grupları içine ayrıştırmak için nasıl anlamaya olamaz gerekir. Sonra ben nihai çıktı gibi bir şeydir:

Product 1:
Name: Product Name 1
Warehouse: Warehouse 1, ACT
Stock: 25

Product 2:
Name: Product Name 2
Warehouse: Warehouse 2, ACT
Stock: 25 

Ben sadece bunu anlamaya olamaz, ve elemanları oldukça standart bir dizi olarak aynı iş yok gibi ben bu DOM şeyler etrafında başımı sarmak olamaz.

Herkes yardımcı, ya da bana doğru yönde işaret edebilir, şimdiye kadar minnettar olacaktır.

1 Cevap

Belki en verimli şekilde ancak

$html = new DOMDocument();
$html->loadHtmlFile('test2.php');

$xPath = new DOMXPath($html);

foreach( $xPath->query('//div[@class="productName"]') as $prodName ) { 
  $prodDetail = $xPath->query('following-sibling::div[@class="productDetail"][1]', $prodName);
  // <-- todo: test if there is one item here -->
  $prodDetail = $prodDetail->item(0);
  echo "Name: " . $prodName->nodeValue . "<br />\n";
  echo "Detail: " . $prodDetail->nodeValue . "<br />\n";
  echo "----\n";
}

baskılar

Name: 
 Product Name 1
<br />
Detail:             
 Warehouse 1, ACT                
 25
<br />
----
Name: 
 Product Name 2
<br />
Detail:             
 Warehouse 2, ACT                
 25
<br />
----
Name: 
 Product Name X
<br />
Detail:             
 Warehouse X, ACT                
 25
<br />
----