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