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できます。

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 に答える