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

时间:2011-03-04 00:33:36

标签: php xml simplexml

  

可能重复:
  Get root node of XML doc using simplexml

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

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

我知道在一个帖子中询问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.

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

$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

1 个答案:

答案 0 :(得分:20)

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

回答你的问题

  

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

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

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