xpath php属性不起作用?

时间:2012-09-04 21:16:46

标签: xpath simplexml php

获取此错误

  

在非对象

上调用成员函数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());

我理解错误的含义,但它是如何成为非对象的?如何返回name的{​​{1}}属性?

1 个答案:

答案 0 :(得分:2)

您的$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'];
}

demo

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

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

是的,这只是一行:)

至于你的班级:

Don't use global. Forget it exists.如果你想要一个类,请注入依赖项,例如:做

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());

demo