使用PHP解析XML文件(cs-s75:David Malan' s)

时间:2015-10-04 10:44:29

标签: php xml parsing

我正在为Pizza Shop制作一个PHP项目[这是David Malan的课程-0 CS-S75建筑动态网站的课程]。我必须编写的代码必须是可扩展的。也就是说,如果披萨店的所有者想要添加一个新类别,他应该能够很容易地做到这一点,我的PHP代码必须适应XML文件中的这些更改,而无需编写任何新代码。

为了使我的代码可扩展,我需要一些方法来过滤XML数据 例如,在根节点<menu>内,我有子节点 item ,其属性如

    <item name="Pizzas">
        <category name="Onions">
        </category>
    </item>

    <item name="Salads">
        <category name = "Garden">
        </category>
    </item>

总共有十个项目标签。

我想要做的是:如果用户想要购买沙拉,我想以下列方式过滤XML DOM树:

// $_POST['selected'] has a value of 'Salads' stored in it
$selected = $_POST['selected'] 
$dom = simple_xml_loadfile("menu.xml")
foreach ($dom -> xpath("menu/item[@name = $selected ]" as $item))
{
   echo $item -> category['name'].'<br />';
}

它应该打印 Garden 以及随后添加到Salads类别的任何其他项目。menu/item[@name = $selected ]会出现问题,因为这可能不是比较属性的正确方法(请注意,XML中的这种属性比较需要单个等号而不是双等号。)显然menu/item[@name = $_POST['selected']]也不起作用。 有效的是@name = "Salads",当然这会破坏XML的可扩展性和PHP的动态性的全部目的。
请帮忙!

1 个答案:

答案 0 :(得分:0)

让我们获取属于您所选择的category属性的父节点的所有name个节点:

另请注意,函数名称为simplexml_load_file而非simple_xml_loadfile

foreach ($dom->xpath('item[@name="' . $selected . '"]/category') as $item)
{
   echo $item->attributes()->{'name'}. PHP_EOL;
}

另请注意使用单引号和双引号括起属性值。

作为参考,这是我用于测试的xml结构:

<menu>
<item name="Pizzas">
    <category name="Onions"></category>
</item>
<item name="Salads">
    <category name = "Garden"></category>
    <category name = "Cesar"></category>
    <category name = "Onion and Tomato"></category>
</item>
</menu>