如何使用PHP解析具有多个根元素的XML?
问题描述:
我想使用PHP读取这个XML文件,我有两个根元素。我在PHP中编写的代码只读取了一个根元素,而当我添加另一个元素时(<action>
)它给我一个错误。 我想要做这样的事情:if($xml->action=="register")
然后打印所有参数。如何使用PHP解析具有多个根元素的XML?
这是我的XML文件:
<?xml version='1.0' encoding='ISO-8859-1'?>
<action>register</action>
<paramters>
<name>Johnny B</name>
<username>John</username>
</paramters>
这是我的PHP脚本:
<?php
$xml = simplexml_load_file("test.xml");
echo $xml->getName() . "<br />";
foreach($xml->children() as $child)
{
echo $child->getName() . ": " . $child . "<br />";
}
?>
我真的不知道该怎么做这一切......
答
修复你的XML,它是无效的。 XML文件只能有1个根元素。
例有效的XML:
<?xml version='1.0' encoding='ISO-8859-1'?>
<action>
<type>register</type>
<name>Johnny B</name>
<username>John</username>
</actions>
或者,如果你只想参数有自己的元素:
<?xml version='1.0' encoding='ISO-8859-1'?>
<action type="register">
<name>Johnny B</name>
<username>John</username>
</actions>
,或者如果你要多个动作:
<?xml version='1.0' encoding='ISO-8859-1'?>
<actions>
<action type="register">
<name>Johnny B</name>
<username>John</username>
</action>
</actions>
编辑 :
正如我在评论中所说的,你的老师应该修复他的XML。它是invalid。另外,他应该把他的XML通过a validator。
如果你真的绝望了,你可以引入一个articificial根元素,但是这是非常糟糕的做法,应该不惜一切代价避免:
$xmlstring = str_replace(
array('<action>','</paramters>'),
array('<root><action>', '</paramters></root>'),
$xmlstring
);
答
因为它是一个invalid
xml文件,你可以做下面的技巧。
- 在第二线插入一个虚拟的开始标记为
<dummy>
- 到底有
</dummy>
快乐解析完成它;)
答
没有对以前的答案是相当准确的。 XML规范定义了几种实体:文档实体,外部解析实体,文档类型定义等。您的示例不是一个格式良好的文档实体,这是XML解析器通常要解析的内容。但是,它是一个格式良好的外部解析实体。处理结构良好的外部解析实体的方法是从一个骨架文件实体引用它,这样的:
<!DOCTYPE wrapper [
<!ENTITY e SYSTEM "my.xml">
]>
<wrapper>&e;</wrapper>
然后传递文件实体到所述XML解析器。
您的XML无效。 XML文件只能有1个根节点 – dtech 2012-04-21 09:50:18
同意,这是不正确的,因此不是XML。修正产生它的东西。另外,如果输出字符串中没有调用'htmlspecialchars()',则返回HTML,如果这些值包含HTML特殊字符(如' bobince 2012-04-21 09:55:32