with texto strip_tags remove limpiar from eliminar allow all php xml web-services

texto - Qué usar para analizar/leer XML en PHP4



string strip_tags (7)

Definitivamente recomendaría el backport SimpleXML, siempre y cuando su rendimiento sea lo suficientemente bueno para sus necesidades. Las demostraciones de xml_parse parecen bastante simples, pero según mi experiencia, puede ponerse muy peludo muy rápido. Las funciones del controlador de contenido no reciben información contextual sobre el lugar donde se encuentra el analizador en el árbol, a menos que lo rastree y lo proporcione en los manejadores de etiquetas de inicio y finalización. Entonces, estás llamando funciones para cada etiqueta de inicio / final o lanzando variables globales para rastrear dónde estás en el árbol.

Obviamente, el backport SimpleXML será un poco más lento, ya que está escrito en PHP y tiene que analizar todo el documento antes de que esté disponible, pero la facilidad de la codificación lo compensa.

Desafortunadamente, tengo que trabajar en una aplicación web más antigua en un servidor PHP4 ; Ahora necesita analizar mucho XM L para llamar a servicios webservices (custom protocol, no SOAP/REST) ;

En PHP5 usaría SimpleXML pero eso no está disponible; Hay Dom XML en PHP4 , pero ya no está predeterminado en PHP5 .

¿Cuáles son las otras opciones? Estoy buscando una solución que todavía funcione en PHP5 una vez que migren.

Un buen extra sería si el XML se puede validar con un esquema.



Puede ser algo básico, pero si es aplicable a los datos con los que está trabajando, podría usar XSLT para transformar su XML en algo utilizable. Obviamente, una vez que actualice a PHP5, XSLT seguirá funcionando y podrá migrar a medida que se realice el análisis de DOM.

Andrés


Si puedes usar xml_parse, entonces ve por eso. Es robusto, rápido y compatible con PHP5. Sin embargo, no es un analizador DOM, sino uno más simple basado en eventos ( también llamado un analizador SAX ), por lo que si necesita acceder a un árbol, tendrá que ordenar la secuencia en un árbol usted mismo. Esto es bastante simple de hacer; Use s stack, y empújelos en el elemento de start-element y pop en end-element .


Quizás también considere considerar los paquetes XML disponibles en PEAR, particularmente XML_Util , XML_Parser y XML_Serializer ...


XML Parser con parse_into_struct convertido en una estructura de árbol de matriz:

<?php /** * What to use for XML parsing / reading in PHP4 * @link http://.com/q/132233/367456 */ $encoding = ''US-ASCII''; // https://gist.github.com/hakre/46386de578619fbd898c $path = dirname(__FILE__) . ''/time-series-example.xml''; $parser_creator = ''xml_parser_create''; // alternative creator is ''xml_parser_create_ns'' if (!function_exists($parser_creator)) { trigger_error( "XML Parsers'' $parser_creator() not found. XML Parser " . ''<http://php.net/xml> is required, activate it in your PHP configuration.'' , E_USER_ERROR ); return; } $parser = $parser_creator($encoding); if (!$parser) { trigger_error(sprintf(''Unable to create a parser (Encoding: "%s")'', $encoding), E_USER_ERROR); return; } xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); $data = file_get_contents($path); if ($data === FALSE) { trigger_error(sprintf(''Unable to open file "%s" for reading'', $path)); return; } $result = xml_parse_into_struct($parser, $data, $xml_struct_values); unset($data); xml_parser_free($parser); unset($parser); if ($result === 0) { trigger_error(sprintf(''Unable to parse data of file "%s" as XML'', $path)); return; } define(''TREE_NODE_TAG'', ''tagName''); define(''TREE_NODE_ATTRIBUTES'', ''attributes''); define(''TREE_NODE_CHILDREN'', ''children''); define(''TREE_NODE_TYPE_TAG'', ''array''); define(''TREE_NODE_TYPE_TEXT'', ''string''); define(''TREE_NODE_TYPE_NONE'', ''NULL''); /** * XML Parser indezies for parse into struct values */ define(''XML_STRUCT_VALUE_TYPE'', ''type''); define(''XML_STRUCT_VALUE_LEVEL'', ''level''); define(''XML_STRUCT_VALUE_TAG'', ''tag''); define(''XML_STRUCT_VALUE_ATTRIBUTES'', ''attributes''); define(''XML_STRUCT_VALUE_VALUE'', ''value''); /** * XML Parser supported node types */ define(''XML_STRUCT_TYPE_OPEN'', ''open''); define(''XML_STRUCT_TYPE_COMPLETE'', ''complete''); define(''XML_STRUCT_TYPE_CDATA'', ''cdata''); define(''XML_STRUCT_TYPE_CLOSE'', ''close''); /** * Tree Creator * @return array */ function tree_create() { return array( array( TREE_NODE_TAG => NULL, TREE_NODE_ATTRIBUTES => NULL, TREE_NODE_CHILDREN => array(), ) ); } /** * Add Tree Node into Tree a Level * * @param $tree * @param $level * @param $node * @return array|bool Tree with the Node added or FALSE on error */ function tree_add_node($tree, $level, $node) { $type = gettype($node); switch ($type) { case TREE_NODE_TYPE_TEXT: $level++; break; case TREE_NODE_TYPE_TAG: break; case TREE_NODE_TYPE_NONE: trigger_error(sprintf(''Can not add Tree Node of type None, keeping tree unchanged'', $type, E_USER_NOTICE)); return $tree; default: trigger_error(sprintf(''Can not add Tree Node of type "%s"'', $type), E_USER_ERROR); return FALSE; } if (!isset($tree[$level - 1])) { trigger_error("There is no parent for level $level"); return FALSE; } $parent = & $tree[$level - 1]; if (isset($parent[TREE_NODE_CHILDREN]) && !is_array($parent[TREE_NODE_CHILDREN])) { trigger_error("There are no children in parent for level $level"); return FALSE; } $parent[TREE_NODE_CHILDREN][] = & $node; $tree[$level] = & $node; return $tree; } /** * Creator of a Tree Node * * @param $value XML Node * @return array Tree Node */ function tree_node_create_from_xml_struct_value($value) { static $xml_node_default_types = array( XML_STRUCT_VALUE_ATTRIBUTES => NULL, XML_STRUCT_VALUE_VALUE => NULL, ); $orig = $value; $value += $xml_node_default_types; switch ($value[XML_STRUCT_VALUE_TYPE]) { case XML_STRUCT_TYPE_OPEN: case XML_STRUCT_TYPE_COMPLETE: $node = array( TREE_NODE_TAG => $value[XML_STRUCT_VALUE_TAG], // ''__debug1'' => $orig, ); if (isset($value[XML_STRUCT_VALUE_ATTRIBUTES])) { $node[TREE_NODE_ATTRIBUTES] = $value[XML_STRUCT_VALUE_ATTRIBUTES]; } if (isset($value[XML_STRUCT_VALUE_VALUE])) { $node[TREE_NODE_CHILDREN] = (array)$value[XML_STRUCT_VALUE_VALUE]; } return $node; case XML_STRUCT_TYPE_CDATA: // TREE_NODE_TYPE_TEXT return $value[XML_STRUCT_VALUE_VALUE]; case XML_STRUCT_TYPE_CLOSE: return NULL; default: trigger_error( sprintf( ''Unkonwn Xml Node Type "%s": %s'', $value[XML_STRUCT_VALUE_TYPE], var_export($value, TRUE) ) ); return FALSE; } } $tree = tree_create(); while ($tree && $value = array_shift($xml_struct_values)) { $node = tree_node_create_from_xml_struct_value($value); if (NULL === $node) { continue; } $tree = tree_add_node($tree, $value[XML_STRUCT_VALUE_LEVEL], $node); unset($node); } if (!$tree) { trigger_error(''Parse error''); return; } if ($xml_struct_values) { trigger_error(sprintf(''Unable to process whole parsed XML array (%d elements left)'', count($xml_struct_values))); return; } // tree root is the first child of level 0 print_r($tree[0][TREE_NODE_CHILDREN][0]);

Salida:

Array ( [tagName] => dwml [attributes] => Array ( [version] => 1.0 [xmlns:xsd] => http://www.w3.org/2001/XMLSchema [xmlns:xsi] => http://www.w3.org/2001/XMLSchema-instance [xsi:noNamespaceSchemaLocation] => http://www.nws.noaa.gov/forecasts/xml/DWMLgen/schema/DWML.xsd ) [children] => Array ( [0] => Array ( [tagName] => head [children] => Array ( [0] => Array ( [tagName] => product [attributes] => Array ( [srsName] => WGS 1984 [concise-name] => time-series [operational-mode] => official ) [children] => Array ( [0] => Array ( [tagName] => title [children] => Array ( [0] => NOAA''s National Weather Service Forecast Data ) ) [1] => Array ( [tagName] => field [children] => Array ( [0] => meteorological ) ) [2] => Array ( [tagName] => category [children] => Array ( [0] => forecast ) ) [3] => Array ( [tagName] => creation-date [attributes] => Array ( [refresh-frequency] => PT1H ) [children] => Array ( [0] => 2013-11-02T06:51:17Z ) ) ) ) [1] => Array ( [tagName] => source [children] => Array ( [0] => Array ( [tagName] => more-information [children] => Array ( [0] => http://www.nws.noaa.gov/forecasts/xml/ ) ) [1] => Array ( [tagName] => production-center [children] => Array ( [0] => Meteorological Development Laboratory [1] => Array ( [tagName] => sub-center [children] => Array ( [0] => Product Generation Branch ) ) ) ) [2] => Array ( [tagName] => disclaimer [children] => Array ( [0] => http://www.nws.noaa.gov/disclaimer.html ) ) [3] => Array ( [tagName] => credit [children] => Array ( [0] => http://www.weather.gov/ ) ) [4] => Array ( [tagName] => credit-logo [children] => Array ( [0] => http://www.weather.gov/images/xml_logo.gif ) ) [5] => Array ( [tagName] => feedback [children] => Array ( [0] => http://www.weather.gov/feedback.php ) ) ) ) ) ) [1] => Array ( [tagName] => data [children] => Array ( [0] => Array ( [tagName] => location [children] => Array ( [0] => Array ( [tagName] => location-key [children] => Array ( [0] => point1 ) ) [1] => Array ( [tagName] => point [attributes] => Array ( [latitude] => 40.00 [longitude] => -120.00 ) ) ) ) [1] => Array ( [tagName] => moreWeatherInformation [attributes] => Array ( [applicable-location] => point1 ) [children] => Array ( [0] => http://forecast.weather.gov/MapClick.php?textField1=40.00&textField2=-120.00 ) ) [2] => Array ( [tagName] => time-layout [attributes] => Array ( [time-coordinate] => local [summarization] => none ) [children] => Array ( [0] => Array ( [tagName] => layout-key [children] => Array ( [0] => k-p24h-n4-1 ) ) [1] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-02T08:00:00-07:00 ) ) [2] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-02T20:00:00-07:00 ) ) [3] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-03T07:00:00-08:00 ) ) [4] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-03T19:00:00-08:00 ) ) [5] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-04T07:00:00-08:00 ) ) [6] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-04T19:00:00-08:00 ) ) [7] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-05T07:00:00-08:00 ) ) [8] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-05T19:00:00-08:00 ) ) ) ) [3] => Array ( [tagName] => time-layout [attributes] => Array ( [time-coordinate] => local [summarization] => none ) [children] => Array ( [0] => Array ( [tagName] => layout-key [children] => Array ( [0] => k-p24h-n5-2 ) ) [1] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-01T20:00:00-07:00 ) ) [2] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-02T09:00:00-07:00 ) ) [3] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-02T19:00:00-07:00 ) ) ... [10] => Array ( [tagName] => end-valid-time [children] => Array ( [0] => 2013-11-06T08:00:00-08:00 ) ) ) ) [4] => Array ( [tagName] => time-layout [attributes] => Array ( [time-coordinate] => local [summarization] => none ) [children] => Array ( [0] => Array ( [tagName] => layout-key [children] => Array ( [0] => k-p12h-n9-3 ) ) [1] => Array ( [tagName] => start-valid-time [children] => Array ( [0] => 2013-11-01T17:00:00-07:00 ) ) ...


Me basaría la sugerencia de Rich Bradshaw sobre el backport simpleXML, pero si eso no es una opción, entonces xml_parse hará el trabajo en PHP4, y aún funciona después de la migración a 5.

$xml = ...; // Get your XML data $xml_parser = xml_parser_create(); // _start_element and _end_element are two functions that determine what // to do when opening and closing tags are found xml_set_element_handler($xml_parser, "_start_element", "_end_element"); // How to handle each char (stripping whitespace if needs be, etc xml_set_character_data_handler($xml_parser, "_character_data"); xml_parse($xml_parser, $xml);

Aquí hay un buen tutorial sobre el análisis de XML en PHP4 que puede ser de alguna utilidad para usted.