0

PHP Notice: Trying to get property of non-object in ...新しく作成されたノードを XPath クエリしようとすると、常にメッセージが表示されます。

私の XML ファイルは次のようになります。

<products xmlns='http://example.com/products'>
    <product id='1'>
        <name>Product name</name>
    </product>
</products>

私のPHPファイルは基本的にXPathクエリを適用して、既存の<product>クエリと2番目のクエリを取得します<name>。これはうまくいきます。

次に<product>、子<name>を持つ new を DOM ルート要素に挿入し、新しく作成された要素に対して 2 番目のクエリを試みます。属性の取得は正常に機能しますが、最初の child<name>の値を取得する必要がある 2 番目のクエリは PHP Notice で失敗しますTrying to get property of non-object in ...

$xmlFile = __DIR__ . '/products.xml';

$xml = new DOMDocument();
$xml->load($xmlFile);
$xml->formatOutput = true;

$xpath = new DOMXPath($xml);
$xpath->registerNamespace('p', $xml->lookupNamespaceUri($xml->namespaceURI));

/*
 * query the first product's ID and name
 */

$product1 = Product::$xpath->query("//p:product[@id=1]")->item(0);

$product1Id = $product1->attributes->getNamedItem('id')->nodeValue;
// => "1"
$product1Name = $xpath->query("p:name", $product1)->item(0)->nodeValue;
// => "Product name"

/*
 * create the second product
 */

$product2Node = $xml->createElement('product');
$product2Node->setAttribute('id', '2');

$product2NameNode = $xml->createElement('name', 'Test');
$product2Node->appendChild($product2NameNode);

$product2 = $xml->documentElement->appendChild($product2Node);

/*
 * query the second product's ID and name
 */

$product2Id = $product2->attributes->getNamedItem('id')->nodeValue;
// => "2"
$product2Name = $xpath->query("p:name", $product2)->item(0)->nodeValue;
// => PHP Notice:  Trying to get property of non-object in ...

$xml->save($xmlFile);

PHP ファイルを実行すると、XML は正しく表示されます。

<products xmlns='http://example.com/products'>
    <product id='1'>
        <name>Product name</name>
    </product>
    <product id='2'>
        <name>Test</name>
    </product>
</products>

私は本当にこれにこだわっています。クエリを実行する前に XML を保存しようとしたり、保存後に XML をリロードしたり、XPath オブジェクトを再作成したりしました。

4

1 に答える 1

1

関数を使用する必要があると思いますcreateElementNS( http://php.net/manual/en/domdocument.createelementns.php ; setAttributeNS を確認することもできます -- http://www.php.net/manual/en /domelement.setattributes.php ) の代わりに、これらの要素が名前空間createElementに属していることを明示的に示すためです。http://example.com/products

$product2Node = $xml->createElementNS('http://example.com/products', 'product');
$product2Node->setAttribute('id', '2');

$product2NameNode = $xml->createElementNS('http://example.com/products', 'name', 'Test');
$product2Node->appendChild($product2NameNode);

(保存後に XML をリロードしても問題が解決されなかったのは少し驚くべきことですが、リロードを試みたコードを見なければ、何が問題なのかを知るのは困難です。)

于 2013-06-28T06:56:13.990 に答える