我有一个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>
实际上没有新的行 - 它是一个连续的字符串和,并且可以有多个&lt;文件&gt;元素。我想要一个提取的正则表达式:
到目前为止我能够提出这个代码,但它只匹配第一个影响,而不是两个:
preg_match_all('/<Document id="(.*)">(<impact.*for="(.*)".*name="(.*)".*<\/impact>)*<\/Document>/U', $response, $matches);
另一种方法是匹配Document元素中的所有内容并再次通过RegEx传递它,但我认为只能使用一个RegEx来执行此操作。
提前多多感谢!
答案 0 :(得分:1)
避免使用正则表达式来解析XML文档。
请参考here了解解析它们的最佳方法。
答案 1 :(得分:1)
只需使用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
}
}
答案 2 :(得分:0)
不要使用RegEx。使用XML解析器。
实际上,如果您不得不担心多个Document
元素并提取各种属性,那么使用XML解析器或XPath等查询语言会更好。