将“开始于”节点与“包含”值结合起来PHP xpath搜索

时间:2019-07-29 11:42:09

标签: php xml xpath

我有一个PHP xpath查询,该查询非常适合在XML文件的单个节点上进行搜索。简化形式如下:

$url = 'myfile.xml';
$xml = simplexml_load_file($url);
$xml->registerXPathNamespace("h", "https://library.example.ac.uk");

$found = $xml->xpath("//h:row[h:AUTHOR1[contains(.,'$search')]]");
...

限制是只能找到AUTHOR1,但是此XML库目录文件可以包含多个作者,例如以下示例条目:

<?xml version="1.0" encoding="UTF-8"?>
<table xmlns="https://library.example.ac.uk">
  <row>
    <AUTHOR1>FABER, Adele</AUTHOR1>
    <AUTHOR2>MAZLISH, Elaine</AUTHOR2>
    <AUTHOR3></AUTHOR3>
    <AUTHOR4></AUTHOR4>
    <CALLNO>306.875 FAB</CALLNO>
    <COPIES>1</COPIES>
    <COPYNO>1.</COPYNO>
    <CUSTOM1>2011</CUSTOM1>
    <CUSTOM2></CUSTOM2>
    <EDITION></EDITION>
    <IBARCODE>856490.</IBARCODE>
    <ISBN>0380705273</ISBN>
    <PLACEPUBL>New York</PLACEPUBL>
    <PUBLISHER>Norton</PUBLISHER>
    <SUBJECT1>Child rearing</SUBJECT1>
    <SUBJECT2>Sibling rivalry</SUBJECT2>
    <SUBJECT3>Psychology</SUBJECT3>
    <SUBJECT4></SUBJECT4>
    <SUBJECT5></SUBJECT5>
    <TITLE>Siblings without rivalry : how to help your children live together so you can live too</TITLE>
    <WEBSITE/>
    <WORDCOUNT>0</WORDCOUNT>
  </row>
</table>

我当前的搜索只会找到“ FABER”,但我也希望能够找到“ MAZLISH”。

我认为这对于starts-with来说是一项工作,但是我尝试过的语法都行不通。我以为我可以做类似的事情:

$xml->xpath("//h:row[h:[starts-with(name(), 'AUTHOR')[contains(...

但是我无法获得任何效果。 (我敢肯定,问题不在于引号或方括号的嵌套。)而且我已经尝试name位的local-namestarts-with了。

所以!如何在AUTHOR1AUTHOR2AUTHORn ...个节点上找到匹配?

1 个答案:

答案 0 :(得分:1)

问题更多与如何选择节点有关,name()将为您提供包含前缀的名称,因此您无需将其指定为查询的单独部分(我认为这是默认前缀为空白)。因此,值将为AUTHOR1等。因此,更改选择作者节点的方式以仅使用/*[starts-with(name(), 'AUTHOR')] ...

$found = $xml->xpath("//h:row[*[starts-with(name(), 'AUTHOR')][contains(.,'$search')]]");