2011-03-04 128 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