我正在为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的动态性的全部目的。
请帮忙!
答案 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>