这个问题在这里已经有了答案:
8年前关闭。
问题: 我有一些关于通过 SimpleXML 解析 XML 的问题。我仍然没有完全解决它。
我知道在一个线程中问 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/