从子元素中的XML获取自定义属性

时间:2016-07-29 00:28:37

标签: php xml

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?>
<Entries>
<Category name="Gallery Wrap">
<Entry>
  <Status>Active</Status>
  <ProductId>12x18_12framewrapwalnut</ProductId>
  <Size>
    <Height>12</Height>
    <Width>18</Width>
    <Depth>12</Depth>
  </Size>
  <Options>
    <Frame cost="86" id="12x18_12framewrapwalnut">Canvas</Frame>
  </Options>
  <Description>12x18 Walnut Framed Gallery Wrap</Description>
  <Weight>.1</Weight>
</Entry>
....
</Category>
</Entries>

我正在尝试获取元素的自定义属性。这是我到目前为止的PHP代码:

$products = simplexml_load_file( 'product_list.xml' );

foreach ( $products as $category ) {
    $attributes = $category->attributes();
    echo '<h2>' . $attributes['name'] . '</h2>';

    echo '<table>';
    echo '<tr><th></th><th>Name</th><th>Your Cost</th><th>Set Price</th></tr>';

    foreach ( $category->Entry as $product ) {
        foreach ( $product->Options as $option ) {
            $option_attributes = $option->attributes();
            $option_vars = get_object_vars( $option );
            foreach ( $option_vars as $option_name => $option_value ) {
                echo '<tr><td><input type="checkbox" value="' . $option_attributes->id . '" /></td><td>' . $product->Description . ' - ' . $option_name . '</td><td>' . $option_attributes->cost . '</td><td><input type="text" size="5" value="' . $option_attributes->cost . '" data-cost="' . $option_attributes->cost . '" class="price" /></td></tr>';
            }
        }
    }
    echo '</table>';
}

我正在构建一个表格,它将这些XML数据提供给用户他们想要包含哪些产品,设置他们自己的价格(我以后可以处理的所有方面,只是无法提取#&# 34;成本&#34;和&#34; id&#34;属性)。

1 个答案:

答案 0 :(得分:0)

考虑使用XSLT解决方案将XML源转换为HTML。在这里,您可以避免任何foreach循环。下面将XSLT作为嵌入字符串运行,但也可以像任何其他格式良好的XML文件一样从文件加载。请务必在php .ini文件中启用XSLT扩展名:extension=php_xsl.dll / php_xsl.so

// Load XML source
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$xml->load('Input.xml');

// Load XSLT string
$xsl = new DOMDocument;
$xslstr = '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
                        omit-xml-declaration="yes"/>

            <xsl:template match="Entries">
                <html>
                    <xsl:apply-templates select="Category"/>
                </html>
            </xsl:template>

            <xsl:template match="Category">
                <h2><xsl:value-of select="@name"/></h2>
                <table>
                    <tr><th></th><th>Name</th><th>Description</th><th>Set-Price</th></tr>
                    <tr><xsl:apply-templates select="Entry"/></tr>
                </table>
            </xsl:template>

            <xsl:template match="Entry">                
                <td><input type="checkbox">
                    <xsl:attribute name="value"><xsl:value-of select="Options/Frame/@id"/></xsl:attribute>
                </input></td>
                <td><xsl:value-of select="Description"/>-<xsl:value-of select="ancestor::Category/@name"/></td>
                <td><xsl:value-of select="Options/Frame/@cost"/></td>
                <td>
                    <input type="text" size="5">
                        <xsl:attribute name="value"><xsl:value-of select="Options/Frame/@cost"/></xsl:attribute>
                        <xsl:attribute name="data-cost"><xsl:value-of select="Options/Frame/@cost"/></xsl:attribute>
                        <xsl:attribute name="class">price</xsl:attribute>
                    </input>
                </td>               

            </xsl:template>

            </xsl:stylesheet>';
$xsl->loadXML($xslstr);

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

// Transform XML source
$newXml = $proc->transformToXML($xml);
echo $newXml;                                   // STRING VALUE

<强>输出

<html>
  <h2>Gallery Wrap</h2>
  <table>
    <tr>
      <th/>
      <th>Name</th>
      <th>Your Cost</th>
      <th>Set-Price</th>
    </tr>
    <tr>
      <td>
        <input type="checkbox" value="12x18_12framewrapwalnut"/>
      </td>
      <td>12x18 Walnut Framed Gallery Wrap-Gallery Wrap</td>
      <td>86</td>
      <td>
        <input type="text" size="5" value="86" data-cost="86" class="price"/>
      </td>
    </tr>
  </table>
</html>

HTML Output from PHP Script