2012-09-10 9 views
5

tengo una larga fila de datos XML con más de 500 artículos en ella, se trata en esta forma:de control de flujo en función del valor del elemento XML

<?xml version="1.0" encoding="ISO-8859-1"?> 
<CATALOG> 
<ITEM> 
    <TITLE>ITEM name</TITLE> 
    <TYPE>TYPE </TYPE> 
    <DESCIPTION>DESCIPTIONiliate Page CPM</DESCIPTION> 
    <PRICE>PRICE</PRICE> 
    <ITEM>http://mysite.com/item-link</ITEM> 
</ITEM> 
</CATALOG> 

y utilizo el siguiente código en la página php para importar los datos del archivo XML:

<?php 
$ITEMSS = new SimpleXMLElement('ITEMS.xml', null, true); 

echo <<<EOF 
<table width="100%" align="center" border="1" bordercolor="#0099ff" cellpadding="1" cellspacing="0"> 

    <tr> 
      <th bgcolor="#66ccff"><span class="style4">ITEM Name</span></th> 
      <th bgcolor="#66ccff"><span class="style4">item TYPE </span></th> 
      <th bgcolor="#66ccff"><span class="style4">item DESCIPTION </span></th> 
      <th bgcolor="#66ccff"><span class="style4">item PRICE</span></th> 
      <th bgcolor="#66ccff"><span class="style4">link to item</span></th> 
    </tr> 

EOF; 
foreach($ITEMSS as $ITEMS) // loop through our DATAS 
{ 
    echo <<<EOF 
    <tr height="30" align=middle> 
      <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td> 
      <td><span class="STYLE8">{$ITEMS->TYPE}</span></td> 
      <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td> 
      <td><span class="STYLE8">{$ITEMS->PRICE}</span></td> 
      <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td> 
    </tr> 

EOF; 
} 
echo '</table>'; 
?> 

tengo que añadir un "if" en el bucle para seleccionar sólo algunos datos si "TIPO" tiene un cierto valor, se mostrará que los datos, si no se saltará eso.

También es necesario añadir sistema de paginación, ya que habrá más de 500 elemento en la lista, quiero la tabla para mostrar una serie de artículos miximum, diciendo 25.

Gracias chicos por su ayuda!

+1

De nada, pero no puedo entender lo que tengo que hacer. – Leri

+1

juzgue la parte de su cabeza 'usando" if "en php de xml' –

+0

Gracias a Fluffeh resolví el problema" si ", ahora necesito agregar el sistema de paginación para mostrar oly 25 elementos por página –

Respuesta

2

Como alternativa, se podría. seleccionar (y proceso) sólo aquellos elementos ITEM que tienen un valor de texto específico en el elemento TIPO través xpath, por ejemplo

<?php 
$doc = new SimpleXmlElement(getData()); 
foreach($doc->xpath("//ITEM[TYPE='A']") as $item) { 
    echo $item->DESCIPTION, "\n"; 
} 

function getData() { 
    return <<< eox 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<CATALOG> 
<ITEM> 
    <TITLE>item 1</TITLE> 
    <TYPE>A</TYPE> 
    <DESCIPTION>desc1</DESCIPTION> 
    <PRICE>price1</PRICE> 
    <ITEM>item1-link</ITEM> 
</ITEM> 
<ITEM> 
    <TITLE>item x</TITLE> 
    <TYPE>B</TYPE> 
    <DESCIPTION>descx</DESCIPTION> 
    <PRICE>pricex</PRICE> 
    <ITEM>itemx-link</ITEM> 
</ITEM> 
<ITEM> 
    <TITLE>item y</TITLE> 
    <TYPE>B</TYPE> 
    <DESCIPTION>descy</DESCIPTION> 
    <PRICE>pricey</PRICE> 
    <ITEM>itemy-link</ITEM> 
</ITEM> 
<ITEM> 
    <TITLE>item 2</TITLE> 
    <TYPE>A</TYPE> 
    <DESCIPTION>desc2</DESCIPTION> 
    <PRICE>price2</PRICE> 
    <ITEM>item2-link</ITEM> 
</ITEM> 
</CATALOG> 
eox; 
} 

grabados

desc1 
desc2 

- Editar: con algunas funciones de paginación -

<?php 
define('ITEMS_PER_PAGE', 10); 
$page = 1; // =intval($_GET['page']); 

$posMin = $page*ITEMS_PER_PAGE; 
$posMax = ($page+1)*ITEMS_PER_PAGE; 
$doc = new SimpleXmlElement(getData()); 
foreach($doc->xpath("(//ITEM[TYPE='A'])[position()>=$posMin and position()<$posMax]") as $item) { 
    echo $item->DESCIPTION, "\n"; 
} 

function getData() { 
    $xml = '<?xml version="1.0" encoding="ISO-8859-1"?> 
<CATALOG>'; 
    for($i=0; $i<100; $i++) { 
     $type = 0===$i%2 ? 'A':'B'; 
     $xml .= " 
     <ITEM> 
     <TITLE>item $i</TITLE> 
     <TYPE>$type</TYPE> 
     <DESCIPTION>desc $i</DESCIPTION> 
     <PRICE>price $i</PRICE> 
     <ITEM>item{$i}-link</ITEM> 
     </ITEM>"; 
    } 
    $xml.='</CATALOG>'; 
    return $xml; 
} 

La función getData() es solo una plantilla que devuelve algunos datos xml.
Para comprender la consulta de xpath, lea el tutorial de xpath (bueno), consulte p. Ej. Using XPATH to access XML elements (was: Good tutorial to learn xpath)

+0

No entiendo, ¿dónde debería incluir el archivo xml para obtener datos, y dónde debería poner ese código para seleccionar algunos datos y crear un sistema de paginación? –

+0

Es un ejemplo independiente, listo para la evaluación de copiar y pegar. No es un bloque de código "cortar aquí y aquí y poner allí". – VolkerK

+0

finalmente lo tengo funcionar, muchas gracias a todos ustedes –

2

Puede añadir el bucle como tal:

foreach($ITEMSS as $ITEMS) // loop through our DATAS 
{ 
    if($ITEMS->TYPE=="BoogeyWoogey") 
    { 
     echo <<<EOF 
     <tr height="30" align=middle> 
      <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td> 
      <td><span class="STYLE8">{$ITEMS->TYPE}</span></td> 
      <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td> 
      <td><span class="STYLE8">{$ITEMS->PRICE}</span></td> 
      <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td> 
     </tr> 

EOF; 
    } 
} 

Suponiendo que se recorre la foreach y desea sólo para mostrar si la propiedad tiene el valor $ITEMS->TYPEBoogeyWoogey en ella.

La parte Paginación no será bastante como simple.

Usted puede hacer algo como esto:

Puede añadir el bucle como tal:

$myLimit=(!empty($_REQUEST['myLimit']) ? $_REQUEST['myLimit'] : 0; 
foreach($ITEMSS as $ITEMS) // loop through our DATAS 
{ 
    for($i=$myLimit;$i<$myLimit+25;$i++) 
    { 
     if($ITEMS->ITEM=="BoogeyWoogey") 
     { 
      echo <<<EOF 
      <tr height="30" align=middle> 
       <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td> 
       <td><span class="STYLE8">{$ITEMS->TYPE}</span></td> 
       <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td> 
       <td><span class="STYLE8">{$ITEMS->PRICE}</span></td> 
       <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td> 
      </tr> 

      EOF; 
     } 
    } 
} 

pero hay que pasar el $ myLimit variable a través de un $GET o $_POST a la página de usarlo en el lazo. (Siéntase libre de cambiar para utilizar una nada $_SESSION o bien que se adapte a su fantasía - Me imaginé usando la variable en un enlace sería la más fácil, por lo que muy probablemente un $GET debe hacer el truco

+0

muchas gracias, funciona perfectamente para la parte "si", ahora necesito la parte de paginación, ¿cómo puedo hacer una lista de elementos en páginas, diciendo sitio/elemento.php? página = 1 y así sucesivamente para enumerar un máximo de 25 por página –

+0

"ahora necesito el paginación parte "- Esa es una nueva pregunta. – VolkerK

+0

@VolkerK Bueno, él lo pidió en el original, además, ya escribí el código en una especie de bofetada :) – Fluffeh

Cuestiones relacionadas