PHP:检查带有属性的XML节点是否存在

7

我似乎无法弄清楚这个问题。我有以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<targets>
  <showcases>
    <building name="Big Blue" />
    <building name="Shiny Red" />
    <building name="Mellow Yellow" />
  </showcases>
</targets>

我需要测试是否存在一个给定名称的<building>节点。在Google上找到的所有内容都告诉我要执行以下操作:

$xdoc->getElementsByTagName('building')->item(0)->getAttributeNode('name')

......但是如果我理解正确的话,这难道不仅测试第一个<building>节点吗?item(0)?我需要使用XQuery吗?

我会感激您的帮助!谢谢!

4个回答

9
我建议使用以下方法(使用PHP的ext/simplexml和XPath):
$name = 'Shiny Red';
$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?>
<targets>
  <showcases>
    <building name="Big Blue" />
    <building name="Shiny Red" />
    <building name="Mellow Yellow" />
  </showcases>
</targets>');
$nodes = $xml->xpath(sprintf('/targets/showcases/building[@name="%s"]', $name);
if (!empty($nodes)) {
    printf('At least one building named "%s" found', $name);
} else {
    printf('No building named "%s" found', $name);
}

1
看起来 xpath 函数缺少一个右括号")"。不过,感谢您提供的优秀代码。 - D.Tate

3

好的,看起来XPath是我想要的。这是我想出来的代码,实现了我的需求:

<?php

$xmlDocument = new DOMDocument();

$nameToFind = "Shiny Red";

if ($xmlDocument->load('file.xml')) {
        if (checkIfBuildingExists($xmlDocument, $nameToFind)) {
        echo "Found a red building!";
    }
}

function checkIfBuildingExists($xdoc, $name) {
    $result = false;
    $xpath = new DOMXPath($xdoc);
    $nodeList = $xpath->query('/targets/showcases/building', $xdoc);
    foreach ($nodeList as $node) {
        if ($node->getAttribute('name') == $name) {
            $result = true;
        }
    }
    return $result;
}

?>

1

此XPath表达式:

       /*/*/building[@name = 'Shiny Red']

选择名为building的元素,其name属性的值为“Shiny Red”,且是顶层元素的子级的子级。

可能在PHP中有一种方法来评估XPath表达式,然后只需评估上述XPath表达式并使用结果


1
如果我理解正确的话,那么这只测试第一个节点,是吗?
是的。所以如果你想使用像那个的DOM方法,你必须在循环中执行它。例如:
$buildings= $xdoc->getElementsByTagName('building');
foreach ($buildings as $building)
    if ($building->getAttribute('name')==$name)
        return true;
return false;

使用XPath可以消除循环,正如Dimitre和sgehrig所发布的那样,但您必须小心允许注入XPath表达式中的哪些字符(例如,$name= '"]'将破坏表达式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接