Найдите, есть ли у узла братья и сестры, используя simplexml

Я пытаюсь найти, есть ли у определенного узла братья и сестры, и если да, я хотел бы знать, что это за братья и сестры.

Это возможно?


person Nic Hubbard    schedule 01.02.2010    source источник


Ответы (3)


Чтобы выбрать братьев и сестер узла, вы должны использовать соответствующую ось XPath. Вот как выбрать всех братьев и сестер узла (игнорируя сам узел)

$siblings = $node->xpath('preceding-sibling::* | following-sibling::*');

Это все, что вам нужно сделать.

person Josh Davis    schedule 01.02.2010

Я думаю, что лучше всего использовать xpath:

<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;

function get_all_siblings(SimpleXMLElement $node)
{
  return $node->xpath('preceding-sibling::* | following-sibling::*');
}

$xml = simplexml_load_string($string);

foreach (get_all_siblings($xml->to) as $e)
  echo $e->getName()."\n";    
?>

Результат:

title
from
body
person Matthew    schedule 01.02.2010
comment
Из-за того, как работает SimpleXML, вы не можете фильтровать узел контекста с помощью ($node != $e), так как это сравнение всегда будет истинным, даже если обе переменные представляют один и тот же узел. - person Josh Davis; 01.02.2010
comment
Я недостаточно использую SimpleXML, чтобы понять это... Я обновил свой код с другим синтаксисом xpath (который, как я вижу, вы уже опубликовали в любом случае), что делает функцию в основном неактуальной. - person Matthew; 01.02.2010

$xml = new SimpleXMLElement($xmlstr);
$xmlNode = $xml->xpath('root/yourNodeName');
$nodeCount = count($xmlNode); 

Не уверен, что это все еще полезно для вас

person Chris    schedule 01.02.2010