Как получить только необходимые элементы xpath? - PullRequest
1 голос
/ 01 октября 2009

У меня есть XML-файл, в котором я хочу сохранить атрибут ранга узла в переменной.

Я пытался:

echo $var = $xmlobj->xpath("//Listing[@rank]");

безрезультатно, просто печатает ArrayArray .

Как это можно сделать?

if($xmlobj = simplexml_load_string(file_get_contents($xml_feed)))
      {
            foreach($xmlobj as $listing)
            {

                  // echo 'Session ID: ' . $sessionId = $listing->sessionId . '<br />';
                  // echo 'Result Set: ' . $ResultSet = $listing->ResultSet . '<br />';

                  print_r($xmlobj->xpath("//Listing[@rank]"));

                  // $result = $xmlobj->xpath("/page/");
                  // print_r($result);

            }
      }

предложение Хенрика:

foreach($xmlobj as $listing)
{
      $var = $xmlobj->xpath("//Listing[@rank]");

      foreach ($var as $xmlElement) 
      {
            echo (string)$xmlElement;
      }
}

Вот, пожалуйста,

<page>
   <ResultSet id="adListings" numResults="3">
      <Listing rank="1" title="Reliable Local Moving Company" description="TEST." siteHost="www.example.com">
      </Listing>

1 Ответ

2 голосов
/ 01 октября 2009

Редактировать после игры с опубликованным примером xml:

  • Мой первоначальный ответ был несколько неправильным - приведение к строке даст вам внутренний текст выбранных элементов, если они есть (не здесь)
  • "//Listing[@rank]" выбирает все элементы «Листинга», которые имеют атрибут «rank». Если вы хотите выбрать сами атрибуты, используйте "//Listing/@rank"
  • Чтобы вывести атрибут, используйте элемент SimpleXMLE с синтаксисом массива: $xmlElement['rank']

Итак, в вашем случае:

foreach($xmlobj as $listing)
{
    $var = $xmlobj->xpath("//Listing/@rank");
    foreach ($var as $xmlElement) 
    {
      echo $xmlElement['rank'];
    }
}

или

foreach($xmlobj as $listing)
{
    $var = $xmlobj->xpath("//Listing[@rank]");
    foreach ($var as $xmlElement) 
    {
      echo $xmlElement['rank'];
      echo $xmlElement['title']; // Added to demonstrate difference
    }
}

должно работать.

В первом случае $ xmlElement будет содержать только атрибут 'rank', тогда как во втором случае он будет содержать полный элемент 'Listing' (следовательно, позволяет выводить заголовок).

...