Ваш подход кажется здравым, я недостаточно знаком с SimpleXML, чтобы сказать, почему он не работает. Но , так как вы просили о лучшем подходе, я неравнодушен к DomDocument и самому XPath:
$xml = <<< XML
<?xml version="1.0"?>
<products>
<product>
<name>xxxx</name>
<category>Category A</category>
</product>
<product>
<name>xxxx</name>
<category>Category B</category>
</product>
<product>
<name>xxxx</name>
<category>Category A</category>
</product>
<product>
<name>xxxx</name>
<category>Category B</category>
</product>
<product>
<name>xxxx</name>
<category>Category B</category>
</product>
</products>
XML;
$dom = new DomDocument;
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$search = "Category A";
$nodes = $xpath->query("//product[category='$search']/name");
foreach ($nodes as $node) {
printf("%s\n", $node->textContent);
}
Для SimpleXML, после небольшого копания, похоже, что ему нужен доступ к элементамс обозначением объекта, а не обозначением массива.Это сработало для меня:
$x = simplexml_load_string($xml);
foreach ($x->product as $product) {
if ((string) $product->category == 'Category A') {
echo (string) $product->name;
}
}
Но я утверждаю, что изучение методов DOM и XPath в долгосрочной перспективе поможет вам лучше;они оба хорошо зарекомендовали себя стандарты, которые используются на многих языках.Знания о SimpleXML - это не то, что вы можете перенести в другую среду.