php parse xml использует именно атрибут

вход XML:

 $url = '<?xml version="1.0" encoding="utf-8"?>
<all_emp>
<emp_detail>
<emp emp_name="john"><img>john_1.jpg</img></emp>
<emp emp_name="john"><img>john_2.jpg</img></emp>
<emp emp_name="john"><img>john_3.jpg</img></emp>
<emp emp_name="jo"><img>jo_1.jpg</img></emp>
<emp emp_name="jo"><img>jo_2.jpg</img></emp>
<emp emp_name="david"><img>david_1.jpg</img></emp>
</emp_detail>
</all_emp>';

$xml = simplexml_load_string($url) or die("Error: Cannot create object");
$imgstring ='';
foreach ($xml->emp_detail->emp as $node ) {
if (strpos((string) $node->attributes()->emp_name, "jo") !== false) {
$imgstring .= (string) $node->img . "<br />";
}
}
echo ($imgstring);

Текущий результат:

john_1.jpg
john_2.jpg
john_3.jpg
jo_1.jpg
jo_2.jpg

Но я хочу получить только IMG с атрибутом «Джо», как,

Ожидаемое:

jo_1.jpg
jo_2.jpg

Как это сделать?

0

Решение

Вы делаете одну вещь неправильно здесь strpos это проверить положение substring а также jo также подстрока john вот почему вы получаете все значения Вместо этого вы можете просто использовать == для сравнения.

Попробуйте этот фрагмент кода здесь

Измените это на:

if (strpos((string) $node->attributes()->emp_name, "jo") !== false) {

Это:

if ($node->attributes()->emp_name== "jo") {
0

Другие решения

Может быть, просто использовать сравнение

if ( $node->attributes()->emp_name == "jo" )

strpos () возвращает позицию подстроки, и это дает вам целое число, а целое число не равно false. strpos () возвращает false, только если не находит подстроку в строке (emp_name = «david» в вашем случае).

0

Используйте Xpath. Это позволяет вам использовать выражения для выбора частей DOM.

$xml = simplexml_load_string($url) or die("Error: Cannot create object");
foreach($xml->xpath('/all_emp/emp_detail/emp[@emp_name="jo"]') as $emp) {
//...
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector