这个问题在这里已经有了答案:




8年前关闭。






问题: 我有一些关于通过 SimpleXML 解析 XML 的问题。我仍然没有完全解决它。

  • 我的根元素 (config_admin) 在哪里或如何获取它的名称?
  • 为什么要嵌套 config_data 数组?即使我在类中用 config_data 替换文件,我也会得到相同的结果。
  • 访问我的元素的最佳方式是什么?
  • 我的文档类型/元素定义有什么问题?

  • 我知道在一个线程中问 3 个 Qs 是个坏习惯,但我不想用那么多重复的代码示例来打扰每个人。

    我想扩展我的知识,所以欢迎每个答案。即使涉及到代码样式或其他。谢谢你。

    我有一个如下所示的 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.
    

    ...并通过使用一个只执行以下操作的类来解析它:
    $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;
            }
        }
        }
    

    但是,输出如下所示:
    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
    

    最佳答案

    您应该从这个问题中删除无关紧要的问题并单独发布它们。保持简短的问题使读者更容易使用react。

    回答你的问题



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

     $config_admin = simplexml_load_file('config.xml');
     echo $config_admin->getName();
    

    关于php - SimpleXML - 如何获取根对象名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5188367/

    10-11 22:34
    查看更多