Как я могу использовать XPath с несколькими значениями атрибутов? - PullRequest
0 голосов
/ 20 февраля 2019

Я в порядке, когда пытаюсь отфильтровать результат XML по значению атрибута, когда он находится в одной форме, но я хочу передать массив значений и вернуть ему элементы, соответствующие этому.

Так что это работает как единое целое:

return get_reader_xml()->xpath("/ReaderDetails/Reader[Status='Available']");

Но если я изменяю значение на массив, как показано ниже, я получаю сообщение об ошибке синтаксиса.

return get_reader_xml()->xpath("/ReaderDetails/Reader[Status=('Available', 'Busy')]");

Очевидно, я знаю, чтоСинтаксическая ошибка есть, но все, что я прочитал, похоже, подсказывает, что вы можете указать здесь разделенные запятыми значения ... какую ошибку я делаю?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вам необходимо создать условие из массива.Это можно сделать, комбинируя array_map() с implode().

$xml = <<<'XML'
<ReaderDetails>
  <Reader Status='Available'/>
  <Reader Status='Busy'/>
  <Reader Status='Broken'/>
</ReaderDetails>
XML;

$statusValues = ['Available', 'Busy'];
$condition = implode(
    ' or ',
    array_map(
        function($status) {
            return '@Status="'.$status.'"';
        },
        $statusValues
    )
);
$expression = '/ReaderDetails/Reader['.$condition.']';

var_dump($expression);

$details = new SimpleXMLElement($xml);
foreach ($details->xpath($expression) as $reader) {
    var_dump((string)$reader['Status']);
} 

Вывод:

string(60) "/ReaderDetails/Reader[@Status="Available" or @Status="Busy"]" 
string(9) "Available" 
string(4) "Busy"
0 голосов
/ 20 февраля 2019
return get_reader_xml()->xpath("/ReaderDetails/Reader[Status='Available' or Status='Busy']");



return get_reader_xml()->xpath("/ReaderDetails/Reader[Status='Available'][Status='Busy']");

Вы можете передать несколько параметров, как описано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...