Смешивание данных из нескольких узлов XML в одну переменную PHP - PullRequest
1 голос
/ 14 мая 2011

Я пытаюсь выяснить, как объединить часть FIPS этого XML-файла в одну переменную php с SimpleXML.

образец XML-файла, который я пытаюсь использовать, находится по адресу http://codepad.org/MQeR2VBZ

В основном я хочу переменную с "001033,001077" в ней (без кавычек "

Я новичок в PHP, и я впервые использую stackoverflow, поэтому, пожалуйста, простите меня, если я полоннеудачи

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Вы можете легко решить эту проблему с помощью XPath .

XPath позволяет запрашивать узлы в документе практически в любой возможной комбинации. Чтобы запросить значение геокода, которому предшествует элемент valueName с содержимым FIPS6 , вы можете использовать этот запрос:

/alert/info/area/geocode/value[preceding-sibling::valueName = "FIPS6"]

Однако документ имеет по умолчанию пространство имен для элемента оповещения (как указано атрибутом xmlns). По умолчанию SimpleXml не сможет получить доступ к каким-либо узлам пространства имен в документе через XPath, пока мы не сообщим ему пространство имен через registerXPathNamespace и не префиксим любые элементы в запросе с произвольным префиксом.

Результатом XPath будет массив, содержащий SimpleXmlElements. Когда вы приводите SimpleXmlElement к строке (или используете его в строковом контексте), он возвращает его nodeValue, то есть значения, которые вы на самом деле хотите объединить, так что вы можете просто вызвать implode в полученном массиве, чтобы объединить значения в строка.

код ( демо )

$alert = simplexml_load_file('http://…');
$alert->registerXPathNamespace('a', 'urn:oasis:names:tc:emergency:cap:1.1');
$fipsValues = implode(',', $alert->xpath(
    '/a:alert/a:info/a:area/a:geocode/a:value[
        preceding-sibling::a:valueName = "FIPS6"
    ]'
));
print_r($fipsValues); // will contain "001033,001077"
0 голосов
/ 14 мая 2011

Это должно привести вас к правильному пути:

$string = <<<XML
  <?xml version='1.0' encoding='utf-8' standalone='yes'?>
  <?xml-stylesheet href='http://alerts.weather.gov/cap/capatomproduct.xsl' type='text/xsl'?>
    <alert xmlns='urn:oasis:names:tc:emergency:cap:1.1'>
      ....
      [rest of xml here]
      ....
    </alert>
  XML;

  $xml = simplexml_load_string( $string );

  $fips6 = array();
  foreach( $xml->info->area->geocode AS $element ) {
      if( $element->valueName == 'FIPS6' ) {
          $fips6[] = $element->value;
      }
  }

  $value = implode( "," $fips6 );
...