我正在寻找数小时的解决方案(在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相关的东西,但我从来没有以这种方式使用它们。
答案 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>
,然后参见上文。