如何编写正则表达式以从xml节点检索值? 实际上节点结构非常大。所以我们不能轻易遍历,所以我想读作普通的文本文件,希望我能写一个正则表达式来找出匹配的元素。
<node1>
<node2>str</node2>
<node3>Text</node3>
<myvalue>Here is the values string..</myvalue>
</node1>
以上是我想要检索值<myvalue></myvalue>
的模式,但在我的xml中有很多其他节点包含<myvalue>
子节点。因此,找到我想要的适当节点的唯一方法是在上面的模式中。值剩余的节点值的唯一更改是<node2>str</node2>
,<node3>Text</node3>
始终相同。
那么如何为php编写正则表达式呢?
答案 0 :(得分:2)
使用XML解析器,Regex不适合进行这种解析。
以下是您可以使用的XML解析器列表:
以下是使用DOM的简单示例,该示例将找到myvalue
中的所有node1
。
<?php
$document = new DOMDocument();
$document->loadXML(
'<all>
<myvalue>Elsewhere</myvalue>
<node1>
<node2>str</node2>
<node3>Text</node3>
<myvalue>Here is the values string..</myvalue>
</node1>
</all>');
$lst = $document->getElementsByTagName('node1');
for ($i=0; $i<$lst->length; $i++) {
$node1= $lst->item($i);
$myvalue = $node1->getElementsByTagName('myvalue');
if ($myvalue->length > 0) {
echo $myvalue->item(0)->textContent;
}
}
?>
答案 1 :(得分:1)
PHP有一个基于SAX的XML解析器,它允许您使用真正的XML解析器,而无需将整个DOM树存储在内存中。 XMLReader允许您解析文件,甚至无需将整个文件读入内存。使用正则表达式挖掘XML将会很痛苦。
答案 2 :(得分:0)
如果您坚持使用正则表达式,请尝试
preg_match_all('<myvalue>([\s\S]+)<\/myvalue>', $text, $matches);