外部 XML-API から JSON への xml を解析する必要があります。そのために、これまでのところ非常にうまく機能するIBM の非常に優れた小さなライブラリを使用しました。残念ながら、いくつかのテキスト ノードにはいくつかの単純なテキスト ノードのすぐ隣にサブノードがあり、サブの子として検出されないことがわかりました。
簡単な例:
<?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
)
)
エントリのみを使用するように xml 文字列を減らすと、simplexml_load_string は子ノードを検出しますが、「見出し」は減らします。
<?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
)
)
)
..xpathを使用して手動で疑わしい領域にクロールし、それらのサブチャイルドに配列変換を使用して、後で配列をマージする以外の解決策があるかどうか疑問に思っています。
これは、解析する必要がある完全な xml ファイルの一例です: http://education.oracle.com/pls/web_prod-plq-dad/catalogs.xml_desc?p_id=D49988DE20&p_org_id=34&p_lang=D
前もって感謝します
編集: この問題を解決するために、より複雑な方法で配列を出力し、子要素、属性、およびノード値から分離できる別のライブラリを使用しました: http://www.criticaldevelopment.net/xml/doc.php