найти детей в php simplexml xpath - PullRequest
       20

найти детей в php simplexml xpath

1 голос
/ 02 сентября 2011

Я выполняю запрос xpath в потоке xml и получаю набор данных. В этом мне нужно найти имя тега. Но я не могу найти способ получить имя тега. Поток xml

<Condition> 
          <Normal dataItemId="Xovertemp-06" timestamp="2011-09-02T03:35:34.535703Z" name="Xovertemp" sequence="24544" type="TEMPERATURE"/> 
          <Normal dataItemId="Xservo-06" timestamp="2011-09-02T03:35:34.535765Z" name="Xservo" sequence="24545" type="LOAD"/> 
          <Normal dataItemId="Xtravel-06" timestamp="2011-09-02T03:35:34.535639Z" name="Xtravel" sequence="24543" type="POSITION"/> 
</Condition> 

Я пытаюсь разобрать это как

Temperature = Normal
Load - Normal

Итак, что я сделал, это

foreach ($xml->xpath("//n:Condition")->children("n") as $child) {
    echo $child["type"] . "="  . $child->getName();
}

Я получаю сообщение об ошибке

Fatal error: Call to a member function children() on a non-object in C:\xampp\htdocs\DataDumper\datadumper\test.php on line 53

Теперь я знаю, что это как-то связано с тем, как я запрашиваю xpath или что-то в этом роде, и я пробовал различные комбинации, такие как добавление * косой черты в запрос, но одна и та же ошибка каждый раз.

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Не уверен, почему вы в первую очередь использовали notaion пространства имен (образец xml не имеет пространства имен)

В вашем xpath вам нужно выбрать все теги condition/normal, а не тег condition, как вы делали ... Кроме того, xpath() возвращает список, поэтому foreach поверх него. Вам не нужно обращаться к нему как к детям, если вы не хотите анализировать детей $child. Там это будет иметь смысл, и это будет работать как ожидалось.

foreach ($xml->xpath("/Condition/Normal") as $child) {
    echo $child["type"] . "="  . $child->getName()."<br/>";
}

выходы

TEMPERATURE=Normal
LOAD=Normal
POSITION=Normal
1 голос
/ 02 сентября 2011

Проблема в том, что SimpleXMLElement::xpath() возвращает массив, а не SimpleXMLElement.Я также не уверен в поддержке пространства имен в запросе XPath, но уверен, что вы можете поиграть с этим, чтобы решить это.В любом случае, я не вижу пространства имен n в вашем XML.

Ответ действительно зависит от того, сколько элементов вы ожидаете, чтобы соответствовать вашему запросу XPath.Если только один, попробуйте

$conditions = $xml->xpath('//Condition');
if (count($conditions) == 0) {
    throw new Exception('No conditions found');
}
$condition = $conditions[0];
foreach ($condition->children() as $child) {
    printf('%s = %s', (string) $child['type'], $child->getName());
}
...