2011-03-04 133 views
1

可能重复:
Get root node of XML doc using simplexmlSimpleXML - 如何获取根对象名称?

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

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

我知道这是坏的习惯在一个线程中询问3个问题,但我不想打扰那些重复的代码示例。

我想花费我的知识,所以每一个答案是值得欢迎的。即使涉及到代码样式或其他。谢谢。


我有类似下面的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 

回答

16

你应该从这个问题中删除无关的问题并单独发布。缩短问题可以让读者更容易回复。

要回答你的问题

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

您的根元素由simplexml_load_string()simplexml_load_file()返回。如果你不知道它的名字,你可以通过getName()得到它的名字。如果知道它的名称,则应该始终将该变量命名为根元素,因为它可以更容易地将变量与它们表示的节点进行匹配。

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

它可以被访问:$ attributes = current($ docs-> attributes() - > {'NAME'}) – 2013-12-23 07:36:55