3

收到此错误

在非对象上调用成员函数 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属性Routes/Route[1]

4

1 回答 1

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'];

这是一个将打印“incoming”的示例:

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

演示

于 2012-09-04T21:36:51.290 回答