如何使用PHP的XMLReader类中的moveToAttribute方法?

时间:2012-08-02 15:29:57

标签: php xml class xmlreader

我遇到了来自PHP的moveToAttribute类的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-&gt; read()),然后处理其内部节点。

非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为没有办法避免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-element的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

我无法告诉你,如何为随机访问示例重写此代码,但我希望,我可以帮助你。