XML / PHP从文本搜索中检索属性值

时间:2014-02-23 00:48:53

标签: php xml xpath simplexml domdocument

我正在寻找数小时的解决方案(在PHP中):

我有一些结构可能不同的XML文件

<page id="this is what I want to extract">
  <boh>
     <bah>
        <other childs (maybe one, maybe ten)>
           <ref id="This is all I know!"> Some text Lorem Ipsum</ref>

我需要两个公式才能:

从所有整个文件中的搜索中提取页面ID ,以获取特定的参考ID ,或参考标记内的部分文字强>

简而言之,我对此文件的了解是: 它有一个参考标记,有时会有 id ,并且内部总是有一些文字。 我要么有ref id,要么有文本的某些部分。 我需要找到包含ref的页面节点的 id

所以: 搜索“这就是我所知道的!”因为ref id 会输出“这就是我要提取的内容”

以及

在ref中搜索“Lorem”为 text 会输出“这就是我要提取的内容”

我怎样才能做到这一点?我已经google了很多,我想我应该制作一些与SimpleXML和XPATH相关的东西,但我从来没有以这种方式使用它们。

2 个答案:

答案 0 :(得分:0)

您可以在代码中使用此XPath表达式:

//page[contains(.//ref/text(), 'Lorem')]/@id

它将搜索<ref>后代的所有<page>元素,并将文本与字符串'Lorem'进行比较(在您的代码中,您应该将其作为变量传递)。它将返回一个包含<page>元素的所有id的集合,其中包含匹配的文本。

答案 1 :(得分:0)

使用xpath查询您的XML:

$xml = simplexml_load_string($x); // assume XML in $x

$result1 = (string)$xml->xpath("//ref[@id = 'This is all I know!']/ancestor::page/@id")[0];

$result2 = (string)$xml->xpath("//ref[contains(.,'Lorem')]/ancestor::page/@id")[0];

看到它有效:https://eval.in/104646

评论:

上面的代码要求最后两行末尾的[0]使用PHP&gt; = 5.4。如果您使用的是较低版本,请更新或执行:

$result = $xml->xpath("blabla");
$result = (string)$result[0];

第一个xpath表达式选择具有给定<ref>属性的树中所有//ref个节点(对于id)。找到后,它会返回其第一个id祖先的<page>属性。

第二个表达式选择包含搜索词组部分的所有<ref>,然后参见上文。