0

これは、PHP Dom ドキュメントに関連しています。

以下のようなサンプルファイルがあります

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <items>
        <item class="pen">
            <no>1</no>
            <name>A</name>
            <price>10</price>
        </item>
        <item class="book">
            <no>2</no>
            <name>B</name>
            <price>20</price>
        </item>
        <item class="pen">
            <no>2</no>
            <name>C</name>
            <price>30</price>
        </item>
    </items>
</document>

PHP コード

$nodeCount = $oElement;
$limitCount = 1;
$nodeCount = $nodeCount->nextSibling;
while($nodeCount && !empty($nodeCount) && $nodeCount->nodeType == 1 && !preg_match("/pen/",$this->GetNodeClass($nodeCount)))
{
    $limitCount++;
    $nodeCount = $nodeCount->nextSibling;
}

ここでGetNodeClass()は、属性をチェックします。classこれが、エラーが発生する原因となるポイントです。

function GetNodeClass($oElement)
{
    //Error comes from below line when try to execute getAttribute() method on TextNode
    $class = $oElement->getAttribute('class');
    return $class;
}

これらの要素をトラバースすると、次のようなエラーが表示されることがあります

致命的なエラー: 未定義のメソッド DOMText::getAttribute() の呼び出し

次に、そのエラーを防ぐために、以下の条件を使用して解決しようとしました。

$node->nodeType == 1

場合によっては正しく動作しますが、説明のようなエラーが常に表示される場合もあります。white spaceノード間のいくつかが原因であることはわかっていました。しかし、XML ファイルの読み取り時にこれらの空白を無視する他の方法はありますか? 私はすでに非常に多くのコードを書いているので、そのためのピンポイントの解決策があれば。

これらすべてに DomDocument オブジェクトを使用します。

どんな助けでも大歓迎です。

4

1 に答える 1

1

エラーを再現しようとして非常に単純なコードを作成しましたが、できませんでした。以下のコードは、エラーなしで問題なく動作します。

<?php

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->load('data.xml');

foreach ($dom->getElementsByTagName('item') as $item)
{
        if (!preg_match("/pen/",GetNodeClass($item)))
        #if ($item->getAttribute('class') == 'book')
        {
                        echo "no." . $item->childNodes->item(0)->nodeValue . "\n";
                        echo "Name: " . $item->childNodes->item(1)->nodeValue . "\n";
                        echo "Price: " . $item->childNodes->item(2)->nodeValue . "\n";
                        echo "----------------------------\n";
        }
}

function GetNodeClass($oElement)
{
    $class = $oElement->getAttribute('class');
    return $class;
}
于 2013-06-07T10:52:29.107 に答える