如何使用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 />"; 
} 
?> 

我真的不知道该怎么做这一切......

+0

您的XML无效。 XML文件只能有1个根节点 – dtech 2012-04-21 09:50:18

+0

同意,这是不正确的,因此不是XML。修正产生它的东西。另外,如果输出字符串中没有调用'htmlspecialchars()',则返回HTML,如果这些值包含HTML特殊字符(如' bobince 2012-04-21 09:55:32

修复你的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 
); 
+0

然后将您的老师指向Wikipedia:http://en.wikipedia.org/wiki/Root_element。同时告诉他通过一个验证器将他的XML:http://validator.w3.org/#validate_by_input – dtech 2012-04-21 09:58:08

+0

也请参阅我编辑的答案 – dtech 2012-04-21 10:04:20

+0

是的,它现在有道理。非常感谢你! – Dianna 2012-04-21 10:07:54

因为它是一个invalid xml文件,你可以做下面的技巧。

  • 在第二线插入一个虚拟的开始标记为<dummy>
  • 到底有</dummy>

快乐解析完成它;)

+0

不好的建议,他应该只是修复他的XML shema,不要这样的技巧 – dtech 2012-04-21 09:56:52

+0

“我正在尝试使用PHP读取这个XML文件,我有两个根元素“。他应该知道这一点。我很生气,为什么这是downvoted? @dtech – Kowser 2012-04-21 10:12:53

+0

正如我所说,我认为给这种解决方案没有任何类型的上下文非常糟糕的建议。这应该是你的最后手段,而不是你的第一个快速解决方案。 – dtech 2012-04-21 10:17:02

没有对以前的答案是相当准确的。 XML规范定义了几种实体:文档实体,外部解析实体,文档类型定义等。您的示例不是一个格式良好的文档实体,这是XML解析器通常要解析的内容。但是,它是一个格式良好的外部解析实体。处理结构良好的外部解析实体的方法是从一个骨架文件实体引用它,这样的:

<!DOCTYPE wrapper [ 
<!ENTITY e SYSTEM "my.xml"> 
]> 
<wrapper>&e;</wrapper> 

然后传递文件实体到所述XML解析器。