我有以下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;属性)。
答案 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>