SimpleXML - 如何获取根对象名称?

kai*_*ser 4 php xml simplexml

可能重复:
使用simplexml获取XML doc的根节点

问题:我通过SimpleXML得到了一些关于XML解析的问题.我仍然没有彻底解决它.

  • 我的根元素(config_admin)在哪里或者如何得到它的名字?
  • 为什么config_data数组是嵌套的?即使我用类中的config_data替换文件,我也得到相同的结果.
  • 访问我的元素的最佳方法是什么?
  • 我的doctype /元素定义有什么问题?

我知道在一个线程中询问3个Q是不好的习惯,但我不想用那么多重复的代码样本来打扰所有人.

我想花费我的知识,所以每个答案都是受欢迎的.即使它涉及代码样式或其他.谢谢.


我有一个像下面这样的xml文件:

    <?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.
Run Code Online (Sandbox Code Playgroud)

...并通过使用一个除以下内容之外的类来解析它:

$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;
        }
    }
    }
Run Code Online (Sandbox Code Playgroud)

但是,输出如下:

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
Run Code Online (Sandbox Code Playgroud)

Jos*_*vis 21

您应该从此问题中删除无关的问题并单独发布.保持问题简短使读者更容易回答.

回答你的问题

我的根元素(config_admin)在哪里或者如何得到它的名字?

您的根元素由simplexml_load_string()或返回simplexml_load_file().如果你不知道它的名字,你可以得到它的名字getName().如果知道它的名称,则应始终将变量命名为与根元素相同的名称,因为这样可以更容易地将变量与它们所代表的节点进行匹配.

 $config_admin = simplexml_load_file('config.xml');
 echo $config_admin->getName();
Run Code Online (Sandbox Code Playgroud)