1
0
mirror of https://github.com/php/doc-es.git synced 2026-03-26 00:12:06 +01:00
Files
archived-doc-es/reference/simplexml/examples.xml
Pedro Antonio Gil Rodríguez eae8214b45 Corregido Error #67522
git-svn-id: https://svn.php.net/repository/phpdoc/es/trunk@333976 c90b9560-bf6c-de11-be94-00142212c4b1
2014-06-27 20:14:18 +00:00

499 lines
13 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: b93b3a95c9b51e6c39782823dc2dac75ced81107 Maintainer: yago Status: ready -->
<!-- Reviewed: yes Maintainer: seros -->
<chapter xml:id="simplexml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="simplexml.examples-basic">
<title>Uso básico de SimpleXML</title>
<para>
Muchos ejemplos en esta referencia requieren un string XML. En vez de
repetir este string en cada ejemplo, se ha puesto en un fichero que se
incluye en cada ejemplo. Este fichero se muestra en la siguiente sección de
ejemplo. Alternativamente, puede crearse un documento XML y leerlo con
<function>simplexml_load_file</function>.
</para>
<para>
<example>
<title>El fichero ejemplo.php a incluir con el string XML</title>
<programlisting role="php" xml:id="simplexml.examples.movie">
<![CDATA[
<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<peliculas>
<pelicula>
<titulo>PHP: Tras el Analilzador</titulo>
<personajes>
<personaje>
<nombre>Srta. Programadora</nombre>
<actor>Onlivia Actora</actor>
</personaje>
<personaje>
<nombre>Sr. Programador</nombre>
<actor>El Act&#211;r</actor>
</personaje>
</personajes>
<argumento>
Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
lenguaje de script? Lo descubrirás en esta intrigante y temible parodia
de un documental.
</argumento>
<grandes-frases>
<frase>PHP soluciona todos los problemas web</frase>
</grandes-frases>
<puntuacion tipo="votos">7</puntuacion>
<puntuacion tipo="estrellas">5</puntuacion>
</pelicula>
</peliculas>
XML;
?>
]]>
</programlisting>
</example>
</para>
<para>
La simplicidad de SimpleXML se ve claramente cuando se extrae un string o
un número de un documento XMl básico.
<example>
<title>Obtener <literal>&lt;argumento&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
echo $peliculas->pelicula[0]->argumento;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
lenguaje de script? Lo descubrirás en esta intrigante y temible parodia
de un documental.
]]>
</screen>
</example>
</para>
<para>
El acceso a elementos dentro de un documento XML que contiene caracteres no permitidos
por la convención de nombres de PHP (p.ej., el guión) puede realizarse encapsulando el
nombre del elemento dentro de un par de llaves y comillas simples.
<example>
<title>Obtener <literal>&lt;frase&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
echo $peliculas->pelicula->{'grandes-frases'}->frase;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
PHP soluciona todos los problemas web
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Acceder a elementos no únicos en SimpleXML</title>
<simpara>
Cuando existen múltiples instancias de un elemento como hijos de un único
elemento padre, se aplican las técnicas normales de iteración.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
/* Para cada <personaje>, se muestra cada <nombre>. */
foreach ($peliculas->pelicula->personajes->personaje as $personaje) {
echo $personaje->nombre, ' interpretado por ', $personaje->actor, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Srta. Programadora interpretado por Onlivia Actora
Sr. Programador interpretado por El ActÓr
]]>
</screen>
</example>
</para>
<note>
<para>
Las propiedades (<literal>$peliculas->pelicula</literal> en el ejemplo anterior)
no son arrays. Son objetos <link linkend="class.iterator">iterables</link>
y <link linkend="class.arrayaccess">accesibles</link>.
</para>
</note>
<para>
<example>
<title>Utilizar atributos</title>
<simpara>
Hasta aquí, únicamente se ha cubierto el trabajo de leer nombres de elementos
y sus valores. SimpleXML puede también acceder a los atributos de los elementos.
Para acceder a ellos, se realiza como si fuesen elementos de un
<type>array</type>.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
/* Acceder a los nodos <puntuacion> de la primera película.
* Mostrar la escala de puntuación también. */
foreach ($peliculas->pelicula[0]->puntuacion as $puntuacion) {
switch((string) $puntuacion['tipo']) { // Obtener los atributos como índices del elemento
case 'votos':
echo $puntuacion, ' votos positivos';
break;
case 'estrellas':
echo $puntuacion, ' estrellas';
break;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
7 votos positivos5 estrellas
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Comparar elementos y atributos con texto</title>
<simpara>
Para comparar un elemento o atributo con un string o pasarlo a una
función que requiera un string, debe realizarse una conversión a string empleando
<literal>(string)</literal>. De lo contrario, PHP trata al elemento como un objeto.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
if ((string) $peliculas->pelicula->titulo == 'PHP: Tras el Analilzador') {
print 'Mi película favorita.';
}
echo htmlentities((string) $peliculas->pelicula->titulo);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Mi película favorita.PHP: Tras el Analilzador
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Comparar dos elementos</title>
<simpara>
Dos SimpleXMLElements son considerados distintos incluso cuando ambos apuntan
al mismo elemento desde PHP 5.2.0.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$pelicula1 = new SimpleXMLElement($xmlstr);
$pelicula2 = new SimpleXMLElement($xmlstr);
var_dump($pelicula1 == $pelicula2); // falso desde PHP 5.2.0
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(false)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Utilizar XPath</title>
<simpara>
SimpleXML incorpora soporte para <acronym>XPath</acronym>.
Para encontrar todos los elementos <literal>&lt;personaje&gt;</literal>:
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
foreach ($peliculas->xpath('//personaje') as $personaje) {
echo $personaje->nombre . ' interpretado por ' . $personaje->actor, PHP_EOL;
}
?>
]]>
</programlisting>
<simpara>
'<literal>//</literal>' actúa como un comodín. Para especificar una ruta
absoluta, hay que omitir una de las dos barras.
</simpara>
&example.outputs;
<screen>
<![CDATA[
Srta. Programadora interpretado por Onlivia Actora
Sr. Programador interpretado por El ActÓr
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Establecer valores</title>
<simpara>
Los datos en SimpleXML no tienen que ser constantes. El objeto permite
que se manipulen todos sus elementos.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
$peliculas->pelicula[0]->personajes->personaje[0]->nombre = 'Srta. Programadora';
echo $peliculas->asXML();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?xml version="1.0" standalone="yes"?>
<peliculas>
<pelicula>
<titulo>PHP: Tras el Analilzador</titulo>
<personajes>
<personaje>
<nombre>Srta. Programadora</nombre>
<actor>Onlivia Actora</actor>
</personaje>
<personaje>
<nombre>Sr. Programador</nombre>
<actor>El Act&#xD3;r</actor>
</personaje>
</personajes>
<argumento>
Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
lenguaje de script? Lo descubrirás en esta intrigante y temible parodia
de un documental.
</argumento>
<grandes-frases>
<frase>PHP soluciona todos los problemas web</frase>
</grandes-frases>
<puntuacion tipo="votos">7</puntuacion>
<puntuacion tipo="estrellas">5</puntuacion>
</pelicula>
</peliculas>
+]]>
</screen>
</example>
</para>
<para>
<example>
<title>Añadir elementos y atributos</title>
<simpara>
Desde PHP 5.1.3, SimpleXML tiene la capacidad de añadir fácilmente hijos
y atributos.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'ejemplo.php';
$peliculas = new SimpleXMLElement($xmlstr);
$personaje = $peliculas->pelicula[0]->personajes->addChild('personaje');
$personaje->addChild('nombre', 'Sr. Analizador');
$personaje->addChild('actor', 'John Doe');
$puntuacion = $peliculas->pelicula[0]->addChild('puntuacion', 'Todos los públicos');
$puntuacion->addAttribute('tipo', 'clasificación');
echo $peliculas->asXML();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?xml version="1.0" standalone="yes"?>
<peliculas>
<pelicula>
<titulo>PHP: Tras el Analizador</titulo>
<personajes>
<personaje>
<nombre>Srta. Programadora</nombre>
<actor>Onlivia Actora</actor>
</personaje>
<personaje>
<nombre>Sr. Programador</nombre>
<actor>El Actor</actor>
</personaje>
<personaje><nombre>Sr. Analizador</nombre><actor>John Doe</actor></personaje></personajes>
<argumento>
Así que, este lenguaje. Es como, un lenguaje de programación. ¿O es un
lenguaje de script? Lo descubrirás en esta intrigante y temible parodia
de un documental.
</argumento>
<grandes-frases>
<frase>PHP soluciona todos los problemas web</frase>
</grandes-frases>
<puntuacion tipo="votos">7</puntuacion>
<puntuacion tipo="estrellas">5</puntuacion>
</pelicula>
</peliculas>
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Interoperatibilidad con DOM</title>
<simpara>
PHP tiene un mecanismo para convertir nodos XML entre los formatos
SimpleXML y DOM. Este ejemplo muestra cómo cambiar un elemento DOM a
SimpleXML.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$dom = new DOMDocument;
$dom->loadXML('<libros><libro><titulo>bla</titulo></libro></libros>');
if (!$dom) {
echo 'Error al analizar el documento');
exit;
}
$s = simplexml_import_dom($dom);
echo $s->libro[0]->titulo;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bla
]]>
</screen>
</example>
</para>
</section>
<section xml:id="simplexml.examples-errors">
<title>Tratar con los errores XML</title>
<para>
Tratar con los errores XML cuando se cargan documentos es una tarea muy sencilla.
Utilizando la funcionalidad de <link linkend="book.libxml">libxml</link> es
posible suprimir todos los errores XML cuando se carga un documento para
luego recorrerlos.
</para>
<para>
El objeto <classname>libXMLError</classname>, retornado por
<function>libxml_get_errors</function>, contiene varias propiedades,
incluyendo el <link linkend="libxmlerror.props.message">mensaje</link>,
<link linkend="libxmlerror.props.line">línea</link> y <link
linkend="libxmlerror.props.column">columna</link> (posición) del
error.
</para>
<para>
<example>
<title>Cargar un string XML erróneo</title>
<programlisting role="php" xml:id="simplexml.examples.error">
<![CDATA[
<?php
libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><roto><xml></roto>");
if ($sxe === false) {
echo "Error cargando XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Error cargando XML
Blank needed here
parsing XML declaration: '?>' expected
Opening and ending tag mismatch: xml line 1 and broken
Premature end of data in tag broken line 1
]]>
</screen>
</example>
</para>
<section role="seealso"><!-- {{{ -->
&reftitle.seealso;
<para>
<simplelist>
<member><function>libxml_use_internal_errors</function></member>
<member><function>libxml_get_errors</function></member>
<member><xref linkend="class.libxmlerror" /></member>
</simplelist>
</para>
</section>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->