使用Php在多级重复xml标签之间提取文本

时间:2014-06-03 18:36:15

标签: php xml regex data-extraction

我正在尝试在多级XML标记之间提取文本。
这是数据文件
    <eSearchResult> <Count>7117</Count> <RetMax>10</RetMax> <RetStart>0</RetStart> <QueryKey>1</QueryKey> <WebEnv> NCID_1_457044331_130.14.22.215_9001_1401819380_1399850995 </WebEnv> <IdList> <Id>24887359</Id> <Id>24884828</Id> <Id>24884718</Id> <Id>24884479</Id> <Id>24882343</Id> <Id>24879340</Id> <Id>24871662</Id> <Id>24870721</Id> <Id>24864115</Id> <Id>24863809</Id> </IdList> <TranslationSet/> <TranslationStack> <TermSet> <Term>BRCA1[tiab]</Term> . . . </TranslationStack> </eSearchResult>
我只想提取<ID></ID>中包含的<IdList></IdList>标记之间的十个ID。 正则表达式让我成为十个中的第一个值。     preg_match_all('~<Id>(.+?)<\/Id>~', $temp_str, $pids) xml数据存储在$ temp_Str变量中,我试图获取存储在$ pids中的值 还有其他任何建议吗?

4 个答案:

答案 0 :(得分:1)

你应该使用php的xpath功能,如下所述:

http://www.w3schools.com/php/func_simplexml_xpath.asp

示例:

<?php
$xml = simplexml_load_file("searchdata.xml");
$result = $xml->xpath("IdList/Id");
print_r($result);
?> 

XPath非常灵活,可以有条件地使用,并且还支持多种其他语言。它比正则表达式更易读,更易于编写,因为您可以在不使用前瞻的情况下构造条件查询。

答案 1 :(得分:1)

使用preg_match_all(http://www.php.net/manual/en/function.preg-match-all.php),我添加了一个与<Id>标记内的数字匹配的正则表达式。最棘手的部分(我认为)是在foreach循环中,我迭代$out[1]。这是因为,从上面的URL,

  

对结果进行排序,以便$ matches [0]是一个完整模式的数组   匹配,$ matches [1]是由第一个匹配的字符串数组   带括号的子模式,依此类推。

preg_match_all('/<Id>\s*(\d+)\s*<\/Id>/',
   "<eSearchResult>
<Count>7117</Count>
<RetMax>10</RetMax>
<RetStart>0</RetStart>
<QueryKey>1</QueryKey>
<WebEnv>
NCID_1_457044331_130.14.22.215_9001_1401819380_1399850995
</WebEnv>
<IdList>
<Id>24887359</Id>
<Id>24884828</Id>
<Id>24884718</Id>
<Id>24884479</Id>
<Id>24882343</Id>
<Id>24879340</Id>
<Id>24871662</Id>
<Id>24870721</Id>
<Id>24864115</Id>
<Id>24863809</Id>
</IdList>
<TranslationSet/>
<TranslationStack>
<TermSet>
<Term>BRCA1[tiab]</Term>
</TranslationStack>
</eSearchResult>",
$out,PREG_PATTERN_ORDER);
foreach ($out[1] as $o){
      echo $o;
      echo "\n";
}
?>

答案 2 :(得分:0)

将此模式(?:\<IdList\>|\G)\s*\<Id\>(\d+)\<\/Id\>g选项一起使用 Demo

答案 3 :(得分:0)

不要使用PCRE来解析XML。下面是CSS选择器,甚至是更好的Xpath来获取XML DOM的一部分。

如果您想要Id

的第一个IdList中的任何eSearchResult元素

/eSearchResult/IdList[1]/Id

正如你所看到的,Xpath&#34;知道&#34;关于XML文档的实际结构。 PCRE没有。

您需要为DOM文档创建Xpath对象

$dom = new DOMDocument();
$dom->loadXml($xmlString);
$xpath = new DOMXpath($dom);

$result = [];
foreach ($xpath->evaluate('/eSearchResult/IdList[1]/Id') as $id) [
  $result[] = trim($id->nodeValue);
}
var_dump($id);