0

moveToAttributePHP のXMLReaderクラスのメソッドに問題があります。
XML ファイルの各行を読み取りたくありません。XML ファイルを順番にたどらずにトラバースできるようにしたいと考えています。つまり、ランダム アクセスです。を使用moveToAttributeすると、属性値を指定したノードにカーソルが移動し、そのノード内のノードを処理できると思ったのですが、うまくいきません。

xml ファイルのスニペットを次に示します。

<?xml version="1.0" encoding="Shift-JIS"?>
    <CDs>
        <Cat Type="Rock">
            <CD>
                <Name>Elvis Prestley</Name>
                <Album>Elvis At Sun</Album>
            </CD>
            <CD>
                <Name>Elvis Prestley</Name>
                <Album>Best Of...</Album>
            </CD>
        </Cat>
        <Cat Type="JazzBlues">
            <CD>
                <Name>B.B. King</Name>
                <Album>Singin' The Blues</Album>
            </CD>
            <CD>
                <Name>B.B. King</Name>
                <Album>The Blues</Album>
            </CD>
        </Cat>
    </CDs>

ここに私のPHPコードがあります:

<?php

    $xml = new XMLReader();
    $xml->open("MusicCatalog.xml") or die ("can't open file");
    $xml->moveToAttribute("JazzBlues");

    print $xml->nodeType . PHP_EOL; // 0
    print $xml->readString() . PHP_EOL; // blank ("")
?>

moveToAttributeに関して、私は何を間違っていますか? ノードの属性を使用してノードにランダムにアクセスするにはどうすればよいですか? ノードCat Type="JazzBlues"を順次実行せずに (つまり、$xml->read()) ターゲットにして、その内部ノードを処理したいと考えています。

どうもありがとうございました。

4

1 に答える 1

1

XMLReader::read を回避する方法はないと思います。XMLreader::moveToAttribute は、XMLReader が既に要素を指している場合にのみ機能します。さらに、XMLReader::moveToAttribute の戻り値をチェックして、起こりうる障害を検出することもできます。たぶん、次のようなことを試してください:

<?php
$xml = new XMLReader();
$xml->open("MusicCatalog.xml") or die ("can't open file");
while ($xml->read() && xml->name != "Cat"){ }
//the parser now found the "Cat"-element
//(or the end of the file, maybe you should check that)
//and points to the desired element, so moveToAttribute will work
if (!$xml->moveToAttribute("Type")){
    die("could not find the desired attribute");
}
//now $xml points to the attribute, so you can access the value just by $xml->value
echo "found a 'cat'-element, its type is " . $xml->value;
?>

このコードは、ファイル内の最初の cat 要素の type-attribute の値を出力する必要があります。ファイルで何をしたいのかわからないので、アイデアに合わせてコードを変更する必要があります。内部ノードを処理するには、次を使用できます。

<?php
//continuation of the code above
$depth = $xml->depth;
while ($xml->read() && $xml->depth >= $depth){
    //do something with the inner nodes
}
//the first time this Loop should fail is when the parser encountered
//the </cat>-element, because the depth inside the cat-element is higher than
//the depth of the cat-element itself
//maybe you can search for other cat-nodes here, after you processed one

ランダムアクセスの例のためにこのコードを書き直す方法はわかりませんが、これでお役に立てれば幸いです。

于 2013-10-16T12:21:36.240 に答える