xpathphp属性不起作用


xpath php attributes not working?

获取此错误

调用非对象上的成员函数attributes()

我在SO上找到了多个答案,但似乎没有一个能解决我的问题?

这是XML:

<Routes>
    <Route type="source" name="incoming">
    </Route>
<Routes>

这是PHP:

$doc = new SimpleXMLElement('routingConfig.xml', null, true);
class traverseXML {
    function getData() {
        global $doc;
        $routeCount = count($doc -> xpath("Route")); //this value returns correctly
        $routeArr = array();
        for ($i = 1; $i <= $routeCount; $i++) {
            $name = $doc -> Route[$i] -> attributes() -> name;
            array_push($routeArr, $name);
        }
        return $routeArr;
    }
    }
    $traverseXML = new traverseXML;
    var_dump($traverseXML -> getData());

我理解这个错误的意思,但它怎么会是非对象呢?如何返回Routes/Route[1]name属性?

您的$doc就是<Routes>。试图从中获取->Routes就是试图获取

<Routes>
    <Routes>

你需要做$doc->Route[$i]。当您以文档根命名变量时,类似这样的错误就不那么常见了

$Routes = new SimpleXMLElement('routingConfig.xml', null, true);

此外,您的XML无效。Routes元素未关闭。

此外,您不需要XPath。SimpleXML是可遍历的,因此您可以通过执行来遍历所有路由

foreach ($Routes->Route as $route) {

并且attributes()返回一个数组,所以您不能将->name从它上链下来,但必须使用方括号访问它。但是无论如何都没有必要使用attributes(),因为您可以通过方括号直接从SimpleXmlElements获取属性,例如

echo $route['name'];

下面是一个将打印"传入"的示例:

$xml = <<< XML
<Routes>
    <Route type="source" name="incoming"/>
</Routes>
XML;
$routes = simplexml_load_string($xml);
foreach ($routes->Route as $route) {
    echo $route['name'];
}

演示

如果您想使用XPath,可以收集数组中的所有属性,如下所示:

$routeNames = array_map('strval', $Routes->xpath('/Routes/Route/@name'));

是的,只有一行:)

至于你的班级:

不要使用global。忘记它的存在吧。如果你想有一个类,注入依赖项,例如做

class Routes
{
    private $routes;
    public function __construct(SimpleXmlElement $routes)
    {
        $this->routes = $routes;
    }
    public function getRouteNames()
    {
        return array_map('strval', $this->routes->xpath('/Routes/Route/@name'));
    }
}
$routes = new Routes(simplexml_load_string($xml));
print_r($routes->getRouteNames());

演示