我正在尝试在多级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中的值
还有其他任何建议吗?
答案 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);