我有一个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-name
和starts-with
了。
所以!如何在AUTHOR1
,AUTHOR2
,AUTHORn
...个节点上找到匹配?
答案 0 :(得分:1)
问题更多与如何选择节点有关,name()
将为您提供包含前缀的名称,因此您无需将其指定为查询的单独部分(我认为这是默认前缀为空白)。因此,值将为AUTHOR1
等。因此,更改选择作者节点的方式以仅使用/*[starts-with(name(), 'AUTHOR')]
...
$found = $xml->xpath("//h:row[*[starts-with(name(), 'AUTHOR')][contains(.,'$search')]]");