我必须重写程序的一部分才能使用XMLReader选择XML文件的一部分进行处理。

以这个简化的XML为例:

<odds>
    <sport>
        <region>
            <group>
                <event name="English Championship 2014-15" eventid="781016.1">
                    <bet name="Kazanan" betid="12377108.1">
                        <selection selectionid="52411062.1"/>
                        </selection>
                    </bet>
                </event>
            </group>
        </region>
    </sport>
</odds>


此呼叫xpath()

$bets = $xml->xpath(
    "//odds/sport/region/group/event/bet/selection[contains(@selectionid,'".$selectionToFind."')]/.."
    );


将选择整个<bet>节点及其子节点(<selection>节点)。

但是,我的代码将只选择一个具有给定<selection>selectionid节点:

$reader = new XMLReader;
$reader->open('file.xml');

while($reader->read()) {
    $event = $reader->getAttribute($value);

    if ($event == 781016.1 ) {
        $node = new SimpleXMLElement($reader->readOuterXML());
        var_dump($node);
        break;
    }
}


如何使用xpath()复制XMLReader的行为,以便选择<bet>节点及其子节点,而不是仅选择一个<selection>子节点?

我猜这个问题可以归结为:我可以通过子代的属性值选择整个父代节点<bet>吗? <selection selectionid="[some_value]">

最佳答案

[忽略SimpleXML解决方案,看一看XMLReader]

我建议使用SimpleXMLElement :: xpath方法。

http://php.net/manual/en/simplexmlelement.xpath.php

$xml = new SimpleXMLElement($xml_string);

/* Search for <a><b><c> */
$result = $xml->xpath("/odds/sport/region/group/event/bet");


$ result将包含所有下注“ bet”的子代。

// XMLReader解决方案**********************

$reader = new XMLReader;
$reader->open('file.xml');
$parent_element = null;

while($reader->read()) {
    $selectionid = $reader->getAttribute('selectionid');

    if ($selectionid == '52411062.1' ) {
        // use the parent of the node with attribute 'selectionid' = '52411062.1'
        $node = $parent_element;
        var_dump($node);
        break;
    }
    elseif ($reader->name === 'bet') { )
    {
        // store parent element
        $parent_element = new SimpleXMLElement($reader->readOuterXML());
    }
}

关于php - 使用XMLReader选择父节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29539526/

10-11 22:38
查看更多