具有特殊条件的xml解析循环

时间:2013-11-23 22:46:40

标签: php simplexml

我想使用simplephp循环遍历xml文件。

我的访问代码是这样的:

// get the path of the file
$file = "xml/".$item_name . "_cfg.xml";

if( ! $xml = simplexml_load_file($file) ){
    echo 'unable to load XML file';
} else {

$item_array = array();
foreach($xml->config->exported->item as $items)
    {
$item_name = (string) $items->attributes()->name;
echo "item name: " . $item_name . "<br />";
}

这将显示此xml中所有项名称的名称,这不是实际的xml,因为某些数据是敏感的,但它与不同的数据基本相同。

因此它将根据以下xml显示如下:

yellow
blue
orange
red
black

这是xml

<?xml version="1.0"?>
<main>
    <config>
        <exported>
            <items>
                <item name="yellow"></item>
                <item name="blue"></item>
                <New_Line />
                <item name="orange"></item>
                <item name="red"></item>
                <New_Line />
                <item name="black"></item>
            </items>
        </exported>
    </config>
<main>

这很好,但我需要展示的是:

yellow
blue
--------
orange
red
--------
black

如果您在xml中注意到某些统计信息之间存在此行

<New_Line />

当我遇到我想要回应几个破折号但是我不确定你是怎么做的因为我不熟悉simplexml

1 个答案:

答案 0 :(得分:1)

可以说这在XML中是一个糟糕的结构选择,因为可能实际意味着有多组item,因此应该有一些父代表来代表每个单独的组。尽管如此,使用SimpleXML,您想要做的事情非常简单。

诀窍是use the ->children() method按顺序遍历所有子节点,无论其名称如何。然后在该循​​环中,您可以examine the name of each node using ->getName()并决定如何采取行动。

这是一个例子(和a live demo of it in action);请注意,我添加了->items以匹配您提供的示例XML,并使用较短的$node['name']而不是$node->attributes()->name

foreach($xml->config->exported->items->children() as $node)
{
    switch ( $node->getName() )
    {
        case 'item':
            $item_name = (string)$node['name'];
            echo "item name: " . $item_name . "<br />";
        break;
        case 'New_Line':
            echo '<hr />';
        break;
    }
}