获取此错误
在非对象
上调用成员函数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}}属性?
答案 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'];
}
如果你想用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());