首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我必须显示来自xml的图像和数据,如何在php中实现?

我必须显示来自xml的图像和数据,如何在php中实现?
EN

Stack Overflow用户
提问于 2017-11-07 04:30:02
回答 2查看 141关注 0票数 0

每次循环时,它只显示Product_URL的文本。我真搞不懂怎么解决这个问题。我想这个循环有什么问题。

代码语言:javascript
运行
复制
<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>

该表应显示:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------------
| Thumbnail | Product Name | Description | Price | Weight | Avail | Product_URL |
---------------------------------------------------------------------------------
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-07 15:44:23

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

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

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

代码语言:javascript
运行
复制
$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(); 

输出:

代码语言:javascript
运行
复制
<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>
票数 1
EN

Stack Overflow用户

发布于 2017-11-07 07:36:09

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

代码语言:javascript
运行
复制
$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,或者在本例中有一个简单的(有点迂回的方式)。使用->children()方法,您可以传递您想要的元素的名称空间,这将为您提供一个新的SimpleXMLElement,其中包含该名称空间的所有元素。

代码语言:javascript
运行
复制
$extraData = $item->children('g',true);
echo "<td>{$extraData->productname}</td>";

现在- $extraData将有任何以g作为命名空间前缀的元素,并且可以像以前一样引用它们,但是您可以使用$extraData代替$item

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47149985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档