问题:我通过SimpleXML得到了一些关于XML解析的问题。我仍然没有彻底解决它。
我知道在一个帖子中询问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
答案 0 :(得分:20)
您应该从此问题中删除无关的问题并单独发布。保持简短的问题使读者更容易回应。
回答你的问题
我的根元素(config_admin)在哪里或者我如何得到它的名字?
您的根元素由simplexml_load_string()
或simplexml_load_file()
返回。如果您不知道其名称,可以使用getName()
获取其名称。如果您知道它的名称,则应始终将该变量命名为与根元素相同的名称,因为这样可以更容易地将变量与它们所代表的节点进行匹配。
$config_admin = simplexml_load_file('config.xml');
echo $config_admin->getName();