analice xml a json en php mientras tiene subnodos junto a un textNode

Necesito analizar algunos xml de una API XML externa a JSON, para hacerlo, utilicé esto muy bonita pequeña biblioteca de IBM que funciona muy bien hasta ahora. Desafortunadamente, descubrí que algunos nodos de texto tienen subnodos muy al lado de algunos nodos de texto simples y no se descubren como subhijos:

ejemplo simplificado:

<?php

$str = 
'<topics>
  <topic>Objekte mit Data Dictionary Views verwalten
    <sub_topics>
      <sub_topic>Data Dictionary erläutern</sub_topic>
      <sub_topic>Dictionary Views</sub_topic>
      <sub_topic>Views USER_OBJECTS und ALL_OBJECTS</sub_topic>
      <sub_topic>Tabellen- und Spalteninformationen</sub_topic>
      <sub_topic>Dictionary Views nach Constraint-Informationen abfragen</sub_topic>
      <sub_topic>Dictionary Views nach View-, Sequence-, Index- und Synonyminformationen abfragen</sub_topic>
      <sub_topic>Tabellen Kommentare hinzufügen</sub_topic>
      <sub_topic>Dictionary Views nach Kommentarinformationen abfragen</sub_topic>
    </sub_topics>
  </topic>
  <topic>Große Datensets bearbeiten
    <sub_topics>
      <sub_topic>Daten mithilfe von Unterabfragen bearbeiten</sub_topic>
      <sub_topic>Daten mit einer Unterabfrage als Quelle abrufen</sub_topic>
      <sub_topic>INSERT-Anweisungen mit einer Unterabfrage als Ziel</sub_topic>
      <sub_topic>Schlüsselwort WITH CHECK OPTION in DML-Anweisungen</sub_topic>
      <sub_topic>Anweisung INSERT für mehrere Tabellen – Varianten</sub_topic>
      <sub_topic>Anweisung INSERT für mehrere Tabellen</sub_topic>
      <sub_topic>Zeilen in einer Tabelle zusammenführen</sub_topic>
      <sub_topic>Über einen Zeitraum erfolgte Datenänderungen überwachen</sub_topic>
    </sub_topics>
  </topic>
  <topic>Daten in verschiedenen Zeitzonen verwalten
    <sub_topics>
      <sub_topic>Zeitzonen</sub_topic>
      <sub_topic>CURRENT_DATE, CURRENT_TIMESTAMP und LOCALTIMESTAMP</sub_topic>
      <sub_topic>Datum und Uhrzeit in einer Sessionzeitzone vergleichen</sub_topic>
      <sub_topic>DBTIMEZONE und SESSIONTIMEZONE</sub_topic>
      <sub_topic>DATE und TIMESTAMP – Unterschiede</sub_topic>
      <sub_topic>Datentypen INTERVAL</sub_topic>
      <sub_topic>EXTRACT, TZ_OFFSET und FROM_TZ</sub_topic>
      <sub_topic>TO_TIMESTAMP, TO_YMINTERVAL und TO_DSINTERVAL</sub_topic>
    </sub_topics>
  </topic>
</topics>';

$xml = simplexml_load_string($str, 'SimpleXMLElement', LIBXML_XINCLUDE);

print_r($xml);

?>

SimpleXMLElement Object
(
  [topic] => Array
  (
    [0] => Objekte mit Data Dictionary Views verwalten
    [1] => Größe Datensets bearbeiten
    [2] => Daten in verschiedenen Zeitzonen verwalten
  )
)

cuando reduzco la cadena xml para usar solo la entrada, simplexml_load_string descubre los nodos secundarios, pero reduce el 'título':

<?php

$str = '<topic>Objekte mit Data Dictionary Views verwalten
      <sub_topics>
        <sub_topic>Data Dictionary erläutern</sub_topic>
        <sub_topic>Dictionary Views</sub_topic>
        <sub_topic>Views USER_OBJECTS und ALL_OBJECTS</sub_topic>
        <sub_topic>Tabellen- und Spalteninformationen</sub_topic>
        <sub_topic>Dictionary Views nach Constraint-Informationen abfragen</sub_topic>
        <sub_topic>Dictionary Views nach View-, Sequence-, Index- und Synonyminformationen abfragen</sub_topic>
        <sub_topic>Tabellen Kommentare hinzufügen</sub_topic>
        <sub_topic>Dictionary Views nach Kommentarinformationen abfragen</sub_topic>
      </sub_topics>
    </topic>';

$xml = simplexml_load_string($str);
print_r($xml);
?>

SimpleXMLElement Object
(
    [sub_topics] => SimpleXMLElement Object
        (
            [sub_topic] => Array
                (
                    [0] => Data Dictionary erläutern
                    [1] => Dictionary Views
                    [2] => Views USER_OBJECTS und ALL_OBJECTS
                    [3] => Tabellen- und Spalteninformationen
                    [4] => Dictionary Views nach Constraint-Informationen abfragen
                    [5] => Dictionary Views nach View-, Sequence-, Index- und Synonyminformationen abfragen
                    [6] => Tabellen Kommentare hinzufügen
                    [7] => Dictionary Views nach Kommentarinformationen abfragen
                )

        )

)

.. Ahora me pregunto si hay alguna otra solución que arrastrarse a áreas sospechosas a mano usando xpath, usar la conversión de matriz para esos sub-hijos y fusionar las matrices después.

Este es un ejemplo del archivo xml completo que necesito analizar: http://education.oracle.com/pls/web_prod-plq-dad/catalogs.xml_desc?p_id=D49988DE20&p_org_id=34&p_lang=D

Gracias por adelantado

Edit: Para resolver este problema, utilicé una biblioteca diferente que imprime matrices de una manera más compleja y puede separarse de los elementos secundarios, los atributos y los valores de los nodos: http://www.criticaldevelopment.net/xml/doc.php

preguntado el 12 de junio de 12 a las 16:06

1 Respuestas

Si puede acceder a estos datos mediante una solicitud AJAX, le recomiendo que use la función jQuery.post() o jQuery.get(), que puede analizar su XML como json, y viceversa.

Es javascript, pero definitivamente es la forma más simple (que yo sepa) de hacer el tratamiento sin pasar horas codificando y buscando, tal vez no sea la solución que mejor se adapte a sus necesidades, pero es una forma que debe buscar.

Respondido el 12 de junio de 12 a las 16:06

Desafortunadamente, no puedo obtener el xml usando ajax porque el cliente no lo permite porque mi aplicación ejecuta un dominio diferente. Para evitar esto, estoy haciendo una solicitud ajax a mi servidor y busco el xml usando curl. Luego puedo procesar los datos directamente y hacer más cosas con ellos (como convertirlos en una matriz y en json para editarlos más), pero ahí es donde estoy atascado. con

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.