Простой синтаксический анализ XML на PHP - PullRequest
0 голосов
/ 17 июля 2010

Ребята, у меня есть XML-файл, который содержит эту информацию:

<?xml version="1.0" encoding="utf-8"?>
<ES>
    <clima code="0" value="Tornado" />
    <clima code="1" value="Tormenta tropical" />
    <clima code="2" value="Huracan" />
    <clima code="3" value="Tormentas severas" />
    <clima code="4" value="Tormentas eléctricas" />
    <clima code="5" value="Mixtos de lluvia y nieve" />
    <clima code="6" value="Mixtos de lluvia y aguanieve" />
    <clima code="7" value="Mixto de nieve y aguanieve" />
    <clima code="8" value="Congelación llovizna" />
    <clima code="9" value="Llovizna" />
    <clima code="10" value="Lluvia helada" />
    <clima code="11" value="Chubascos" />
    <clima code="12" value="Chubascos" />
    <clima code="13" value="Nieve" />
    <clima code="14" value="Nieve, Chubascos" />
    <clima code="15" value="Nieve, ventoso" />
    <clima code="16" value="Nieve" />
    <clima code="17" value="Granizo" />
    <clima code="18" value="Aguanieve" />
    <clima code="19" value="Tormenta de tierra" />
    <clima code="20" value="Niebla" />
    <clima code="21" value="Haze" />
    <clima code="22" value="Humo" />
    <clima code="23" value="blustery" />
    <clima code="24" value="Viento" />
    <clima code="25" value="Frío" />
    <clima code="26" value="Nublado" />
    <clima code="27" value="Chubascos por la noche" />
    <clima code="28" value="Día parcialmente nublado" />
    <clima code="29" value="Noche Parcialmente nublado" />
    <clima code="30" value="Día Parcialmente nublado" />
    <clima code="31" value="Noche Despejada" />
    <clima code="32" value="Soleado" />
    <clima code="33" value="Noche despejada" />
    <clima code="34" value="Día despejado" />
    <clima code="35" value="mixtos de lluvia y granizo" />
    <clima code="36" value="Caluroso" />
    <clima code="37" value="Tormentas aisladas" />
    <clima code="38" value="Tormentas aisladas" />
    <clima code="39" value="Tormentas aisladas" />
    <clima code="40" value="Chaparrones" />
    <clima code="41" value="Nieve" />
    <clima code="42" value="Tormenta de nieve dispersos" />
    <clima code="43" value="Nieve" />
    <clima code="44" value="Parcialmente nublado" />
    <clima code="45" value="Tormentas" />
    <clima code="46" value="snow showers" />
    <clima code="47" value="Tormentas aisladas" />
    <clima code="3200" value="Sin datos" />
</ES>

Я очень новичок в php, можете ли вы показать мне, как при коде вернуть значение ? Пожалуйста, без каких-либо модных классов:)

Ответы [ 4 ]

5 голосов
/ 17 июля 2010
$code = isset($_GET['code']) ? $_GET['code'] : 0;

$xml = simplexml_load_file('.....file.xml');

foreach ($xml->clima as $item)
{
  if ($code == (int)$item['code'])
  {
    echo 'Found, code' . $item['code'] . ' value: '. $item['value'] . '<br />'; 
    break;
  }
}

редактировать, пример:

<?php
$str='<?xml version="1.0" encoding="utf-8"?>
<ES>
    <clima code="0" value="Tornado" />
    <clima code="1" value="Tormenta tropical" />
    <clima code="2" value="Huracan" />
    <clima code="3" value="Tormentas severas" />
    <clima code="4" value="Tormentas eléctricas" />
    <clima code="5" value="Mixtos de lluvia y nieve" />
    <clima code="6" value="Mixtos de lluvia y aguanieve" />
    <clima code="7" value="Mixto de nieve y aguanieve" />
    <clima code="8" value="Congelación llovizna" />
    <clima code="9" value="Llovizna" />
    <clima code="10" value="Lluvia helada" />
    <clima code="11" value="Chubascos" />
    <clima code="12" value="Chubascos" />
    <clima code="13" value="Nieve" />
    <clima code="14" value="Nieve, Chubascos" />
    <clima code="15" value="Nieve, ventoso" />
    <clima code="16" value="Nieve" />
    <clima code="17" value="Granizo" />
    <clima code="18" value="Aguanieve" />
    <clima code="19" value="Tormenta de tierra" />
    <clima code="20" value="Niebla" />
    <clima code="21" value="Haze" />
    <clima code="22" value="Humo" />
    <clima code="23" value="blustery" />
    <clima code="24" value="Viento" />
    <clima code="25" value="Frío" />
    <clima code="26" value="Nublado" />
    <clima code="27" value="Chubascos por la noche" />
    <clima code="28" value="Día parcialmente nublado" />
    <clima code="29" value="Noche Parcialmente nublado" />
    <clima code="30" value="Día Parcialmente nublado" />
    <clima code="31" value="Noche Despejada" />
    <clima code="32" value="Soleado" />
    <clima code="33" value="Noche despejada" />
    <clima code="34" value="Día despejado" />
    <clima code="35" value="mixtos de lluvia y granizo" />
    <clima code="36" value="Caluroso" />
    <clima code="37" value="Tormentas aisladas" />
    <clima code="38" value="Tormentas aisladas" />
    <clima code="39" value="Tormentas aisladas" />
    <clima code="40" value="Chaparrones" />
    <clima code="41" value="Nieve" />
    <clima code="42" value="Tormenta de nieve dispersos" />
    <clima code="43" value="Nieve" />
    <clima code="44" value="Parcialmente nublado" />
    <clima code="45" value="Tormentas" />
    <clima code="46" value="snow showers" />
    <clima code="47" value="Tormentas aisladas" />
    <clima code="3200" value="Sin datos" />
</ES>
';
$str = utf8_encode($str);

$code = isset($_GET['code']) ? $_GET['code'] : 0;

$xml = simplexml_load_string($str);

foreach ($xml->clima as $item)
{
  if ($code == (int)$item['code'])
  {
    echo 'Found, code' . $item['code'] . ' value: '. $item['value'] . '<br />'; 
    break;
  }
}
4 голосов
/ 17 июля 2010

Вот пример, который я протестировал, используя XSLTProcessor :

<?php

$xsl = new DOMDocument();
$xsl->loadXML('<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="code" />
<xsl:template match="/">
    <xsl:for-each select="ES/clima[@code=$code]">
        <xsl:value-of select="@value"/>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>');

$xml = new DOMDocument();
$xml->load("data.xml"); // this is the name of your XML data file

$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);

$code = 19; // or whatever code you're looking for
$proc->setParameter('', 'code', $code);
echo $proc->transformToXML($xml);

Выход:

Tormenta de tierra

Извините, что здесь используются классы, но это работает. Вам не нужно писать никаких циклов в PHP. Он просто возвращает значение, которое вы ищете.

Вы также можете сохранить таблицу стилей XSL в файле и загрузить ее по имени файла вместо примера, который я показал, загружая его литеральной строкой.


Комментарий от @VolkerK: я пытался синхронизировать эти три решения, но запускал их 10000 раз в сценарии PHP CLI и использовал microtime(true) до и после.

  • XSLP-процессор (решение Билла Карвина): 5,74 с
  • SimpleXML с XPath (решение @ VolkerK): 3,94 с
  • SimpleXML без XPath (решение @Kieran Allen): 3,91сек
  • fgets / sscanf (@John at решение CashCommons): 3.45сек
2 голосов
/ 17 июля 2010

Вы можете использовать XPath , чтобы найти / выбрать один или несколько определенных элементов в документе.

Например, расширение DOM в PHP предоставляет интерфейс XPath, а также SimpleXML

$doc = simplexml_load_string('...your xml document here...');
foreach( $doc->xpath('/ES/clima[@code="19"]') as $clima ) {
  echo $clima['value'], "\n";
}
0 голосов
/ 17 июля 2010

Если ваш XML так же хорошо отформатирован, вы можете просто загрузить файл построчно и найти правильный code, начиная с начала файла, а затем вернуть следующий value. Что-то вроде:

$n = sscanf($line, "<clima code=\"%d\" value=\"$s\" />", $code, $value);

(Полностью не проверено, но вы поняли идею, я надеюсь. Просто проходите по линиям, пока не получите правильное значение $code, тогда $value найдет совпадение.)

Но я согласен с Керри, что классы были бы намного проще (например, http://php.net/manual/en/book.xml.php) и позаботились бы о дополнительных непредвиденных обстоятельствах в вашем XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...