Php “合并”;以“开始”;带有“的节点”;包括「;xpath搜索中的一个值

Php “合并”;以“开始”;带有“的节点”;包括「;xpath搜索中的一个值,php,xml,xpath,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')]]"); .

我有一个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>
但我无法让任何一种变体起作用。(我敢肯定,问题不在于引号或括号的嵌套。)我已经尝试了
名称
本地名称
,因为
位开头


所以!如何查找对任何
AUTHOR1
AUTHOR2
AUTHORn
的点击率。。。节点?

问题更多的是如何选择节点,
name()
将为您提供包含前缀的名称,因此您不需要将其指定为查询的单独部分(我认为它是默认前缀,因此为空)。因此,该值将为
AUTHOR1
等。因此,请更改选择author节点的方式,使其仅使用
/*[以(name(),'author')开头]

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

(很抱歉延迟)您可以始终将
/..
添加到XPath的末尾以回溯到行元素(
//h:row/*[以(name(),'AUTHOR')]开头][包含(,'$search')]/..
)。我还更新了一个更接近你的原始版本的答案…绝妙的作品绝对完美!!非常感谢延迟真是耽搁!;)
$found = $xml->xpath("//h:row[*[starts-with(name(), 'AUTHOR')][contains(.,'$search')]]");