我有一个XML文档,我想从中提取一些数据:
<tnt:results>
<tnt:result>
<Document id="id1">
<impact _blabla_ for="tree.def" name="Something has changed"
select="moreblabla">true</impact>
<impact _blabla_ for="plant.def" name="Something else has changed"
select="moreblabla">true</impact>
</Document>
</tnt:result>
</tnt:results>
实际上没有新的行——它是一个连续的字符串和,并且可以有多个<文档>元素。我想要一个正则表达式,它提取:
- id1
- 树.def/plant.def
- 有些东西变了
到目前为止,我能够想出这个代码,但它只与第一个影响相匹配,而不是两者都匹配:
preg_match_all('/<Document id="(.*)">(<impact.*for="(.*)".*name="(.*)".*<'/impact>)*<'/Document>/U', $response, $matches);
另一种方法是匹配Document元素中的所有内容,并再次通过RegEx传递它,但我认为我只需要一个RegEx就可以做到这一点。
提前感谢!
只需使用DOM,就足够简单:
$dom = new DOMDocument;
$dom->loadXML($xml_string);
$documents = $dom->getElementsByTagName('Document');
foreach ($documents as $document) {
echo $document->getAttribute('id'); // id1
$impacts = $document->getElementsByTagName('impact');
foreach ($impacts as $impact) {
echo $impact->getAttribute('for'); // tree.def
echo $impact->getAttribute('name'); // Something has changed
}
}
不要使用RegEx。使用XML解析器。
实际上,如果您必须担心多个Document
元素和提取各种属性,那么最好使用XML解析器或XPath之类的查询语言。