如何使用PHP解析具有多个根元素的XML?

时间:2012-04-21 09:47:31

标签: php xml parsing root

我正在尝试使用PHP读取此XML文件,我有两个根元素。我在PHP中编写的代码只读取一个根元素,当我添加另一个根元素(<action>)时,它给出了一个错误。 我想做这样的事情:if($xml->action=="register")然后打印所有参数。

这是我的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 />";
}
?>

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

3 个答案:

答案 0 :(得分:3)

修复您的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

如果你真的很绝望,你可以引入一个人工根元素,但这是非常糟糕的做法,应该不惜一切代价避免:

$xmlstring = str_replace(
    array('<action>','</paramters>'),
    array('<root><action>', '</paramters></root>'),
    $xmlstring
);

答案 1 :(得分:2)

之前的答案都不是很准确。 XML规范定义了几种实体:例如文档实体,外部解析实体,文档类型定义。您的示例不是格式良好的文档实体,通常要求XML解析器解析。但是,它是一个结构良好的外部解析实体。处理格式良好的外部解析实体的方法是从骨架文档实体引用它,如下所示:

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

然后将文档实体传递给XML解析器。

答案 2 :(得分:0)

由于它是invalid xml文件,您可以执行以下操作。

  • 在第二行插入虚拟开始标记<dummy>
  • 最后以</dummy>
  • 结束

快乐解析;)