使用通配符获取xml节点(php)

时间:2015-10-19 08:59:24

标签: php xml

我有xml文件

<root>
<param1_2014>1</param1_2014>
<param2_2014>2</param2_2014>
<param2_2015>3</param2_2015>
<param2_2015>4</param2_2015>
<param3_2015>5</param3_2015>
</root>

我如何获得所有节点,其中包含&#34; 2015&#34;标签中的子串?我无法在手册中搜索它。

谢谢!

1 个答案:

答案 0 :(得分:1)

xpath函数contains就是您所追求的,只需根据您的字符串检查元素名称。

实施例

$xml = <<<'XML'
<root>
<param1_2014>1</param1_2014>
<param2_2014>2</param2_2014>
<param2_2015>3</param2_2015>
<param2_2015>4</param2_2015>
<param3_2015>5</param3_2015>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

foreach ($xpath->query("//*[contains(local-name(),'2015')]") as $node) {
    echo $dom->saveXML($node), "\n";
}

输出:

<param2_2015>3</param2_2015>
<param2_2015>4</param2_2015>
<param3_2015>5</param3_2015>

如果你想将它专门限制在“2015”中的结尾标签,那就更多了。遗憾的是xpath 2不受支持,或者xpath函数ends-with在这里是完美的,所以你必须使用substring

实施例

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXPath($dom);

$search = "2015";
$query = "//*[
    substring(
        local-name(),
        string-length(local-name()) - string-length('$search') + 1
    ) = '$search'
]";

foreach ($xpath->query($query) as $node) {
    echo $dom->saveXML($node), "\n";
}

输出:

<param2_2015>3</param2_2015>
<param2_2015>4</param2_2015>
<param3_2015>5</param3_2015>