【问题标题】:PHP XPath Query get nodes containing mutiple sub stringsPHP XPath Query 获取包含多个子字符串的节点
【发布时间】:2016-06-20 19:03:33
【问题描述】:

我的 record.xml 看起来像:

<record>
    <name>john</name>
    <gender>male</gender>
    <subject>mathematics, english, science</subject>
</record>
<record>
    <name>jamie</name>
    <gender>female</gender>
    <subject>mathematics, science</subject>
</record>
<record>
    <name>jamie</name>
    <gender>female</gender>
    <subject>social-science, english</subject>
</record>

我想编写一个 xpath 查询,它将返回包含一个或多个给定主题的记录节点。

例如:

如果想获取学生的科目数学和科学

然后应该返回第二条记录,即

<record>
    <name>jamie</name>
    <gender>female</gender>
    <subject>mathematics, science</subject>
</record>

这是我到现在为止所做的:

<?php
        $xmldoc = new DOMDocument();
        $xmldoc->load('record.xml');

        $xpathvar = new Domxpath($xmldoc);

        $res = $xpathvar->query('//record/subject[. = "science"]');
        foreach($res as $data){
                echo $data->textContent.'<br>';
        }
?>

我想达到这样的结果:

<?php
        $xmldoc = new DOMDocument();
        $xmldoc->load('record.xml');

        $xpathvar = new Domxpath($xmldoc);

        $res = $xpathvar->query('//record/subject[. = "science" and mathematics]');
        foreach($res as $data){
                echo $data->textContent.'<br>';
        }
?>

【问题讨论】:

  • 您遇到了什么问题?你用的是什么 PHP 库?
  • @chris85 我更新了问题

标签: php xml xpath


【解决方案1】:

除非您可以将主题拆分为自己的节点,否则真的不会有一个很好的方法来实现这一点。

/r/record[contains(subject,"science") and contains(subject,"mathematics") and ...  ]

The 不会确定单词的拆分位置,所以如果你有一个主题,比如“计算机科学”,那么你会得到一个错误的命中。最好将主题文本拆分为单独的元素。

 <record>
   <name>jamie</name>
   <gender>female</gender>
   <subject>mathematics</subject>
   <subject>science</subject>
</record>

xpath =  /r/record[subject[.="science" and .="mathematics" ... and ...] ]

或有某种形式的分词分隔符,如下所示:

 <record>
   <name>jamie</name>
   <gender>female</gender>
   <subject>|mathematics|science|</subject>
</record>

xpath = /r/record[contains(subject,"|science|") and contains(subject,"|mathematics|") and ...  ]

【讨论】:

  • 我无法更改 xml 文件。 :(
  • 我用这个查询解决了这个问题。感谢@Phil B 的帮助 $xpathvar->query('//record[contains(subject,"science") 或 contains(subject, "mathematics")]');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多