我正在尝试在多级 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>
包含的标签之间的十个ID的数据文件<IdList></IdList>
。正则表达式让我得到十个值中的第一个值。
preg_match_all('~<Id>(.+?)<\/Id>~', $temp_str, $pids)
xml 数据存储在 $temp_Str 变量中,我正在尝试获取存储在 $pids 中的值还有其他建议吗?
4 回答
您应该使用 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 很灵活,可以有条件地使用,并且还支持多种其他语言。它也比正则表达式更具可读性和更容易编写,因为您可以在不使用前瞻的情况下构造条件查询。
使用 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";
}
?>
将此模式(?:\<IdList\>|\G)\s*\<Id\>(\d+)\<\/Id\>
与g
选项
Demo一起使用
不要使用 PCRE 来解析 XML。这里有 CSS 选择器和更好的 Xpath 来获取 XML DOM 的一部分。
如果你想要第一个元素中的任何Id
元素IdList
eSearchResult
/eSearchResult/IdList[1]/Id
正如您所见,Xpath “知道” 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);