Mögliches Duplikat:
Wurzelknoten eines XML-Dokuments mit simplexml abrufen
QUESTIONs: Ich habe einige Fragen zum XML-Parsing über SimpleXML. Ich komme immer noch nicht ganz drum herum.
- Wo ist mein Root-Element (config_admin) oder wie erhalte ich seinen Namen?
- Warum ist das config_data-Array verschachtelt? Selbst wenn ich die Datei mit config_data innerhalb der Klasse ersetze, erhalte ich das gleiche Ergebnis.
- Wie kann ich am besten auf meine Elemente zugreifen?
- Was stimmt nicht mit meinen Doctype-/Elementdefinitionen?
Ich weiß, dass es eine schlechte Angewohnheit ist, 3 Fragen in einem Thread zu stellen, aber ich wollte nicht jeden mit so vielen sich wiederholenden Codebeispielen belästigen.
Ich möchte mein Wissen erweitern, daher ist jede Antwort willkommen. Auch wenn es um Code-Styling oder anderes geht. Dankeschön.
Ich habe eine Xml-Datei wie die folgende:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE config_admin [
<!ELEMENT config_admin (page,sub_page)>
<!ELEMENT page (page_title,slug,menu_title)>
<!ELEMENT page_title (#PCDATA)>
<!ELEMENT slug (#PCDATA)>
<!ELEMENT menu_title (#PCDATA)>
]>
<config_admin>
<!--
MAIN Page
-->
<page>
<page_title>OOO</page_title>
<slug>ooo</slug>
<menu_title>OOO</menu_title>
<cap>manage_options</cap>
<icon_url>OOO</icon_url>
<position>OOO</position>
<tabs>
<abc_uid>abc</abc_uid>
<def_uid>def</def_uid>
<ghi_uid>ghi</ghi_uid>
</tabs>
<!-- Options for the main page -->
<opt_group>
<group_name>OOO</group_name>
<opt_name>OOO</opt_name>
<tab>ABC</tab>
<!-- Section -->
<section>
<section_title>OOO</section_title>
<section_UID>OOO</section_UID>
<!-- Defaults -->
<field_defaults>
<field_uid>Value</field_uid>
<_oxoxoxo>OXO</_oxoxoxo>
<_axaxaxa>AXA</_axaxaxa>
<_cxcxcxc>CXC</_cxcxcxc>
</field_defaults>
... etc.
...und analysiere es mit einer Klasse, die nichts anderes tut als das Folgende:
$data = new myXmlParser( $require_files_path.$file );
$data = (array) $data;
$config_data[] = $data;
echo '<pre>OUTPUT: <br />';
echo '===================================================================== <br />';
foreach ( $config_data as $key => $value) :
print_r($value);
echo '<br />';
endforeach;
echo '</pre>';
// The Class i use to parse
if ( !class_exists('myXmlParser') ) {
class myXmlParser {
public $file;
public $config_data;
public function __construct( $file ) {
$this->file = $file;
$this->config_data = simplexml_load_file( $this->file );
$this->config_data = $this->recursive_parse( $this->config_data );
}
private function recursive_parse( $data ) {
$output = array();
if ( is_object($data) ){
settype( $data, 'array' );
}
foreach ( $data as $key => $value ){
if ( $key == 'comment' )
unset($key);
if ( $key && $value ) :
if ( is_array($value) || is_object($value) ) {
$output[$key] = $this->recursive_parse( $value );
}
else {
$output[$key] = (string) $value;
}
endif;
}
return $output;
}
}
}
Die Ausgabe sieht jedoch wie folgt aus:
OUTPUT:
=====================================================================
Array
(
[file] => R:\development\xampp\htdocs\wordpress\wp-content\themes\child_test/config_admin.xml
[config_data] => Array
(
[page] => Array
(
[page_title] => OXO
[slug] => oxo
[menu_title] => OXO
[cap] => manage_options
[icon_url] => OXO
[position] => OXO
[tabs] => Array
(
[abc_uid] => abc