我必须从xml显示图像和数据,我怎么能在PHP中做到这一点?

时间:2017-11-07 04:30:03

标签: php xml

每次循环时,它只显示Product_URL的文本。我真的很困惑如何解决这个问题。我猜循环有问题。

<html>
    <head>
        <title>Display main Image</title>
    </head>
    <body>
      <table>
        <tr>
         <th>Thumbnail Image</th>
         <th>Product Name</th>
         <th>Product Description</th>
         <th>Price</th>
         <th>Weight</th>
         <th>Avail</th>
         <th>Product URL</th>
        </tr>
        <tr>
          <?php
            $doc = new DOMDocument;

            $doc->preserveWhiteSpace = false;           
            $doc->Load('xml_feeds7.xml');
            $xpath = new DOMXPath($doc);

            $listquery = array('//item/thumbnail_url', '//item/productname', '//item/productdesciption', '//item/price', '//item/weight', '//item/avail', '//item/product_url');

            foreach ($listquery as $queries) {
             $entries = $xpath->query($queries);
             foreach ($entries as $entry) { ?>
        <tr>
        <td>
            <img src="<?php echo $entry->nodeValue; ?>" width="100px" height="100px">
        </td>
        <td>
            <?php echo "$entry->nodeValue"; ?>
        </td>
        <td>
            <?php echo "$entry->nodeValue"; ?>
        </td>
        <td>
            <?php 
            $price_value = $entry->nodeValue;
            echo str_replace($price_value, ".00", "");
            ?>
        </td>
        <td>
        <?php 
            $weight_value = $entry->nodeValue;
            echo str_replace($weight_value, ".00", "");
            ?>
        </td>
        <td>
            <?php echo "$entry->nodeValue"; ?>
        </td>
        <td>
            <?php echo "$entry->nodeValue"; ?>
        </td>
        <td>
            <?php echo "$entry->nodeValue"; ?>
        </td>
        </tr>
    }

   }
        </tr>
       </table>
       </body>
  </html>

该表应显示:

---------------------------------------------------------------------------------
| Thumbnail | Product Name | Description | Price | Weight | Avail | Product_URL |
---------------------------------------------------------------------------------

2 个答案:

答案 0 :(得分:1)

我已将其更改为使用SimpleXML,因为这是一个相当简单的数据结构 - 但这会获取每个<item>,然后从那里显示值。我只用一些值来做这件事,但希望这表明这个想法......

$doc = simplexml_load_file('xml_feeds7.xml');
foreach ( $doc->xpath("//item") as $item )  {
    echo "<tr>";
    echo "<td><img src=\"{$item->thumbnail_url}\" width=\"100px\" height=\"100px\"></td>";
    echo "<td>{$item->productname}</td>";
    echo "<td>{$item->productdesciption}</td>";

    // Other fields...

    $price_value = str_replace(".00", "",(string)$item->price);
    echo "<td>{$price_value}</td>";

    // Other fields...

    echo "</tr>";
}

不是对每个值使用XPath,而是使用$item->elementName,因此$item->productname是产品名称。引用每个字段的更简单的方法。 请注意,对于price字段,当您进一步处理它时 - 您必须将其强制转换为字符串以确保它将正确处理。

更新: 如果你需要在SimpleXML中访问命名空间中的数据,你可以使用XPath,或者在这种情况下有一个简单的(bit roundoutout方式)。使用->children()方法,您可以传递所需元素的命名空间,然后这将为您提供一个新的SimpleXMLElement,其中包含该命名空间的所有元素。

$extraData = $item->children('g',true);
echo "<td>{$extraData->productname}</td>";

现在 - $extraData将包含任何带有g作为命名空间前缀的元素,并且可以使用与之前相同的方式引用它们,但使用$item代替$extraData

答案 1 :(得分:1)

Xpath可以直接返回标量值(字符串和数字),但您必须在表达式中进行类型转换并使用DOMxpath::evaluate()

您应该迭代这些项目,然后将该项目用作详细数据表达式的上下文。构建单独的列表可能会导致无效数据(如果缺少项目中的元素)。

最后,您可以使用DOM方法创建HTML表。这样它将负责转义和关闭标签。

$xml = <<<'XML'
<items>
  <item>
    <thumbnail_url>image.png</thumbnail_url>
    <productname>A name</productname>
    <productdescription>Some text</productdescription>
    <price currency="USD">42.21</price>
    <weight unit="g">23</weight>
    <avail>10</avail>
    <product_url>page.html</product_url>
  </item>
</items>
XML;

$document = new DOMDocument;
$document->preserveWhiteSpace = false;           
$document->loadXml($xml);
$xpath = new DOMXPath($document);

$fields = [
  'Thumbnail' => 'string(thumbnail_url)',
  'Product Name' => 'string(productname)',
  'Description' => 'string(productdescription)',
  'Price' => 'number(price)',
  'Weight' => 'number(weight)',
  'Availability' => 'string(avail)',
  'Product_URL' => 'string(product_url)'
];

$html = new DOMDocument();
$table = $html->appendChild($html->createElement('table'));
$row = $table->appendChild($html->createElement('tr'));

// add table header cells
foreach ($fields as $caption => $expression) {
  $row
    ->appendChild($html->createElement('th'))
    ->appendChild($html->createTextNode($caption));  
}

// iterate the items in the XML
foreach ($xpath->evaluate('//item') as $item) {
  // add a new table row
  $row = $table->appendChild($html->createElement('tr'));
  // iterate the field definitions
  foreach ($fields as $caption => $expression) {
    // fetch the value using the expression in the item context
    $value = $xpath->evaluate($expression, $item);
    switch ($caption) {
    case 'Thumbnail':
      // special handling for the thumbnail field
      $image = $row
        ->appendChild($html->createElement('td'))
        ->appendChild($html->createElement('img'));
      $image->setAttribute('src', $value);
      break;
    case 'Price':
    case 'Weight':
      // number format for price and weight values
      $row
        ->appendChild($html->createElement('td'))
        ->appendChild(
          $html->createTextNode(
            number_format($value, 2, '.')
          )
      );  
      break;
    default:
      $row
        ->appendChild($html->createElement('td'))
        ->appendChild($html->createTextNode($value));  
    }
  }
}

$html->formatOutput = TRUE;
echo $html->saveHtml(); 

输出:

<table>
<tr>
<th>Thumbnail</th>
<th>Product Name</th>
<th>Description</th>
<th>Price</th>
<th>Weight</th>
<th>Availability</th>
<th>Product_URL</th>
</tr>
<tr>
<td><img src="image.png"></td>
<td>A name</td>
<td>Some text</td>
<td>42.21</td>
<td>23.00</td>
<td>10</td>
<td>page.html</td>
</tr>
</table>