2010-05-16 2 views
2

얘들 아, 나는이 내가 정보 당겨하려고 다음과 같은 HTML 구조 : 나는 소스 HTML을 제어 할 수 있습니다 당신이 볼로하지 않는는 PHP의 DOM 요소를 액세스 도움이 필요

// 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> 

을 productName과 함께 제공되는 productDetail은 공통 요소 내에 포함되어 있지 않습니다.

이제 다음 PHP 코드를 사용하여 페이지를 구문 분석하려고합니다. 다음 인쇄

$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"; 
} 

:

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 

지금, 이것은 내가 원하는 가깝습니다. 그러나 각 제품, 창고 및 수량 재고에 대해 일부 처리를 수행해야하며이를 별도의 제품 그룹으로 구문 분석하는 방법을 알 수 없습니다. 난 그냥 그것을 알아낼 수 없으며, 요소가 꽤와 동일하게 작동하지 않는 한 나는이 DOM 물건 주위에 내 머리를 정리 할 수 ​​

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

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

: 나는 후 오전 최종 출력은 뭔가처럼 표준 배열.

누구든지 도움을 주거나 올바른 방향으로 나를 가리키면 나는 감사 할 것입니다.

답변

0

어쩌면 가장 효율적인 방법하지만

$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"; 
} 

인쇄

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 /> 
---- 
+0

덕분에,이 올바른 방향으로 시작이다. 예제 코드를 사용하면 올바르게 작동합니다. 그러나 제 제작 코드에는 몇 가지 추가 div가 있으며 productName과 productDetail 사이에 걸쳐이 코드가 손상되는 것으로 보입니다. 다음 형제는 처음에 일치하는 바로 다음 요소를보고 단순히 "productDetail"이 다음에있을 것으로 예상합니까? 다음 요소가 쓰레기 일 때 어느 것이 깨질까요? –

+0

추가 div로 스크립트를 테스트했기 때문에 이상합니다. 'following-siblings' 축에는 문맥 노드 다음의 형제 인 모든 노드가 문서 순서로 포함됩니다. 어쩌면 당신은 당신의 문서에 대해 더 자세하고 현실적인 예를 제공해야 할 것입니다. – VolkerK

+0

좋은 친구! 어쨌든 제 게으른/졸린 실수였습니까? 코드가 아름답게 작동하고 있습니다! 고마워요 !! –