php - 使用 XMLReader 选择父节点

标签 php xml xpath xml-parsing

我必须重写部分程序才能使用 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> child ?

我想问题归结为:我可以选择整个父节点 <bet>通过 child 的属性值,例如<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/

相关文章:

RSelenium - 使用 xpath 选择父元素

php - Drupal 在后台显示来自 python 脚本的数据 :Asynchronous Solution

c# - 如何将对象转换为强类型 XML

php - 如何循环mysql_query直到结果?

java - 如果 docx 已有一些,如何添加新的 CustomXmlDataStoragePropertiesPart?

ruby - Hpricot XML 文本搜索

r - 无法将XML元素与R中的XPath匹配

c++ - Xercesc XPath 功能

php - 在 WooCommerce 中保存订单后,保存自定义项目元数据

javascript - Symfony2 : how to exclude 1 js asset file?