获取此错误
调用非对象上的成员函数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());
演示