Sugerir un enfoque adecuado para analizar la respuesta xml no válida con espacios de nombres en este caso

Estoy usando php para analizar la respuesta xml de una API. Aquí hay una respuesta de muestra :

 $xml = '              0.02  '; 

Tenga en cuenta los siguientes puntos:

La respuesta tiene un marcado no válido como este –

  • etiqueta start inside no está allí, pero está cerrada.
  • tags dentro de no están cerradas.
  • El atributo src del iframe contiene una URL con múltiples params separados por & . Por lo tanto, esta y cualquier otra URL posible deben urlencoded antes de $dom->loadXML(); (mira mi código a continuación).

Requisito

  • Necesito leer lo que esté dentro de las tags .
  • Necesito analizar el marcado inválido (como lo estoy obteniendo) y leer el contenido correctamente.
  • La URL necesita ser codificada para los personajes como se detalla en ¿Qué personajes necesito para escapar en documentos XML? . Esto debe hacerse con la lógica actual que estoy siguiendo.

Código actual

Así que, ahora tengo este código que funciona bien si el contenido dentro de las tags es un marcado válido –

 $dom = new DOMDocument; $dom->loadXML($xml); // load the XML string defined above - works only if entire xml is valid $adHtml = ""; foreach ($dom->getElementsByTagNameNS('http://api-url', '*') as $element) { if($element->localName == "content") { $children = $element->childNodes; foreach ($children as $child) { $adHtml .= $child->ownerDocument->saveXML($child); } } } echo $adHtml; //Have got necessary contents here 

Verifique el código de trabajo aquí (con marcado válido y parámetro único en iframe src).

Lo que estoy pensando ahora

Ahora, yendo con la solución dada por @hakre en mi pregunta anterior –

  • Intenté con DOMDocument::loadHTML() y falla como esperaba. Da advertencias como – Warning: DOMDocument::loadHTML(): Tag q:response invalid in Entity, line: 2

  • escapar de una parte específica de la cadena para los caracteres enumerados en ¿Qué caracteres necesito para escapar en documentos XML? .

Pregunta

Finalmente, si tengo que “escapar de una parte específica de la cadena” (en mi caso, busque lo que sea que esté entre el ) como figura en esa respuesta a urlencode, lo que sea que esté allí, entonces, ¿por qué no debería buscar esos delimitadores ( ) en primer lugar y devolver eso? Entonces, ¿cuál es el beneficio de usar DOMDocument::loadXML() en tales casos? Creo que este es un caso bastante común …

Entonces, mi pregunta tiene este Requisito y los puntos dados en Nota los siguientes puntos: ¿cuál es la forma más inteligente de proceder?

Uno puede tomar muchas decisiones válidas al implementar un estándar. Sin embargo, no hay opciones válidas para violar un estándar. Debe presentar a quienes le envían estos datos algunas de sus opciones válidas para implementar el estándar XML.

Una de esas opciones sería colocar el contenido HTML dentro de CDATA . Otra sería codificar el HTML.

Simplemente no es aceptable que te envíen basura y que se llame XML. Tal vez no se dan cuenta de que no es XML válido, pero simplemente no lo es. Si no le creen, entonces simplemente debe intentar abrir el “XML” en un editor XML estándar como XMLspy. Permítales apelar a XMLspy como un tercero que puede decirles si su XML es válido.

A continuación, pueden elegir libremente cómo producir un XML válido, y se le pedirá que maneje su elección.