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