如何将XPath与多个属性值一起使用?

时间:2019-02-20 14:32:46

标签: php xml xpath

当我尝试按属性值过滤XML结果(采用单一形式)时,我很好,但是我想传递一个值数组,并让它返回与此匹配的元素。

所以这可以作为一个单独的

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

但是,如果将值更改为数组,如下所示,则会收到语法错误消息。

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

很明显,我知道语法错误是什么,但是我读过的所有内容似乎都建议您在此处输入逗号分隔的值...我在犯什么错误?

2 个答案:

答案 0 :(得分:1)

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



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

您可以像上述方式一样传递多个参数。

答案 1 :(得分:0)

您需要从数组创建条件。可以结合使用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"