在PHP5上读取XML文件的第一个元素+属性和次要元素+属性

时间:2014-09-12 13:35:11

标签: php xml simplexml

实际上我希望我的页面能够在PHP5上读取这个XML文件。

我将此示例作为samples.xml文件:

<sample amount="5" name="Pasta" dest="pasta/sample_pasta.lua">
    <product name="pasta1"/>
    <product name="pasta2"/>
</sample>
...
<sample amount="18" name="Meat" dest="pasta/sample_meat.lua">
    <product name="meat1"/>
    <product name="meat2"/>
</sample>

还有我的PHP代码:

<?php
echo '<table><tr><td>Name</td><td>Amount</td><td>Product</td></tr>';
$reader = new XMLReader();
if (!$reader->open("samples.xml")) {
die("Failed to open 'samples.xml'");
}
while($reader->read()) {
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'sample') {
$amount = $reader->getAttribute('amount');
$name = $reader->getAttribute('name');
echo '<tr><td>'.$name.'</td><td>'.$amount.'</td><td>---?[array result here]?---</td></tr>';
}
echo '</table>';
?>

这就是我的脚本在页面上打印的内容:

  

姓名|金额|产品

     

意大利面| 5 | ---?[数组结果在这里]?---

     

肉类18 | ---?[数组结果在这里]?---

但我需要此页面将产品名称读取为数组,如下所示:

  

姓名|金额|产品

     

意大利面| 5 | pasta1,pasta2

     

肉类18 | meat1,meat2

请,任何信息都会有所帮助!!!

1 个答案:

答案 0 :(得分:1)

实际上我已经习惯了SimpleXMLElement,但这应该破解它。

echo '<table cellpadding="10"><tr><td>Name</td><td>Amount</td><td>Product</td></tr>';
$reader = new XMLReader();
if (!$reader->open("samples.xml")) {
die("Failed to open 'samples.xml'");
}
while($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'sample') {
        $amount = $reader->getAttribute('amount');
        $name = $reader->getAttribute('name');
        $sample = $reader->expand();
        $products = array();
        foreach($sample->childNodes as $product) {
            if(get_class($product) != 'DOMElement') continue;
            $products[] = (string) $product->getAttribute('name');
        }

        echo '<tr><td>'.$name.'</td><td>'.$amount.'</td><td>'.implode(', ', $products).'</td></tr>';
    }
}
echo '</table>';

查看手册后,您需要展开它以获取样本,循环子节点(这是产品),然后再次使用->getAttribute。收集数组中的属性,然后将它们内爆。

这是SimpleXMLElement版本(实际上是相同的概念):

$xml = simplexml_load_file('samples.xml');
echo '<table cellpadding="10"><tr><td>Name</td><td>Amount</td><td>Product</td></tr>';
foreach($xml->sample as $sample) {
    $name = (string) $sample->attributes()->name;
    $amount = (string) $sample->attributes()->amount;
    $products = array();
    foreach($sample->product as $product) {
        $products[] = (string) $product->attributes()->name;
    }
    $products = implode(', ', $products);
    echo "
        <tr>
            <td>$name</td>
            <td>$amount</td>
            <td>$products</td>
        </tr>
    ";
}
echo '</table>';