entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Como poner php dentro de un xml

Hola, queria extraer el contenido de mi base de datos de mysql en un xml que tengo en mi web, no quiero descargar el archivo ya que lo que busco es crear como una api para que los usuarios puedan extraer el contenido por javascript. como hago para poder hacerlo sin que me de error de formato?

Tengo el archivo asi:

    <?xml version="1.0"?>
    <?php
    ----
   ?>
   <xml>
   <user>
   <id><?=$id?></id>
   <username><?=$usuario?></username>
   <imagein><?=$gurl?></imagein>
   <state><?=$state?></state>
   </user>
  </xml>

2 Respuestas

1voto

Gustavo Puntos1350

deberías enviar una cabecera de XML para que todos los navegadores lo interpreten como un xml,
Ahora quizá el problema se deba los caracteres especiales, en ese caso usando el método htmlspecialchars(cadena) debería solucionarse.

<?php header("Content-Type: text/xml;charset=UTF-8"); ?>
<?xml version="1.0"?>
<?php
  $id = 1;
  $usuario = "usuario";
  $gurl = "http://asiaelsur.com<>";
  $state = "A";
?>
<xml>
  <user>
    <id><?= $id ?></id>
    <username><?= $usuario ?></username>
    <imagein><?= htmlspecialchars($gurl) ?></imagein>
    <state><?= $state ?></state>
  </user>
</xml>

Con ese código tendrías un xml como este:

<xml>
    <user>
        <id>1</id>
        <username>usuario</username>
        <imagein>http://asiaelsur.com<></imagein>
        <state>A</state>
    </user>
</xml>

0voto

Jaumesv comentado

Es que tampoco me interpreta el PHP, Vale ya lo tengo, muchas gracias! Al final he puesto en el .htaccess esta linea:

AddType application/x-httpd-php .xml

y he puesto lo que me has dicho y funciona! Excepto la etiqueta de <?xml?> que no hacia falta

1voto

Leonardo-Tadei Puntos227320

Hola Jaumesv,

tendríamos que ver qué tipo de error de formato obtienes.

Si por ejemplo es un árbol desbalanceado o una etiqueta sin cerrar, tendrás que ser más prolijo en la generación del XML.

Si en cambio es que hay caracteres "raros" o marcas de XML entre el contenido que hace que el archivo aparezca "roto", lo que tenés que hacer es encerrar estos string indicando son datos. En este ejemplo inventado sería:

<xml>
   <post>
      <id>2</id>
      <title><![CDATA[Un título]]></title>
      <date>2014-01-13 15:49</date>
      <content><![CDATA[Este es el contenido que aparecerá como dato sin romper el formato]]></content>
   </post>
</xml>

En resumen, lo que pueda romper el formato lo ponés entre <![CDATA[ y ]]> y lo que sean números o datos saneados no, de manera tal de que el XML no agregue más caracteres innecesarios.

Luego al leerlo, hacés de cuenta que los CDATA no están, ya que los parser que extraen contenido los respetan y devuelven solo lo que hay en su interior.

Saludos!

0voto

Jaumesv comentado

Pues a mi no me va! He puesto todo el php entre <![CDATA[ ]]> y me sale esto:

    Error de lectura XML: error de sintaxis
    Ubicación: http://m2s.es/app/api/file.xml?id=1
    Número de línea 2, columna 1:
   <![CDATA[ 
    ^

Si le quito el que dice ya no me da error pero no me interpreta el php

0voto

Leonardo-Tadei comentado

Para que un XML no de errores, todo el contenido del archivo debe ser XML. En el ejemplo del enlace a http://m2s.es/app/api/file.xml?id=1 el archivo, inicia con:

<?xml version="1.0"?>
<?php
error_reporting(0);
session_start();  
include('../config.php');
$lang = $_SESSION['lang'];
...

en dónde la línea 1 es la definición del tipo de documento, pero la línea 2 no es XML !

Si no entiendo mal lo que querés hacer, tu archivo XML debería tener la siguiente estructura:

<?xml version="1.0"?>
<xml>
  <code><![CDATA<?php
error_reporting(0);
session_start();  
include('../config.php');
$lang = $_SESSION['lang'];
...
}else{
  $state = '3';
}
?>]]></code>
  <user>
    <id><![CDATA[<?=$id?>]]></id>
    <username><![CDATA[<?=$usuario?>]]></username>
    <imagein><![CDATA[<?=$gurl?>]]></imagein>
    <state><![CDATA[<?=$state?>]]></state>
  </user>
</xml>

de esta forma el código va dentro de un nodo XML, y los print implícitos van encapsulados en CDATA para que el <? no rompa el nodo contenedor al tener una marca de nodo.

No se puede simplemente poner contenido en un XML si no es dentro de un nodo correctamente estructurado.

PD: tal vez sería bueno que pongas un ejemplo de cómo esperas la salida, para ayudarte a definir el XML correctamente... se me escapa la intención de enviar código PHP en un XML para recibirlo con una API JavaScipt, ya que el JavaScript debería correr del lado del servidor para poder, de alguna manera, hacer que se interprete el código PHP recibido.

0voto

Jaumesv comentado

Yo lo que quiero es que ese codigo lo lea el servidor y haye las variables para ponerlas en las etiquetas xml!

0voto

Leonardo-Tadei comentado

No había entendido esto por tu pregutna :-(

Lo que querés entonces e hace simplemente así:

<?php
 // tu código PHP acá:
 //
 header("Content-Type: text/xml;charset=UTF-8"); // Cabecera emitiendo el tipo de documento
 print('<?xml version="1.0"?>'); // Esto va en un print para que el intérprete PHP no confunda el <? con el inicio de código a interpretar.
// los datos que pueden romper el XML entre CDATA
 ?>
   <xml>
   <user>
   <id><?=$id?></id>
   <username><![CDATA[<?=$usuario?>]]></username>
   <imagein><![CDATA[<?=$gurl?>]]></imagein>
   <state><![CDATA[<?=$state?>]]></state>
   </user>
  </xml>

y la llamada a la API:

http://m2s.es/app/api/file.php?id=1

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta