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

5
我将尝试使用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 />";
}
?>

我真的不知道如何处理所有这些...


您的XML无效。XML文件只能有一个根节点。 - dtech
同意,这不是格式良好的XML。修复产生它的任何问题。此外,您正在将输出字符串回显到HTML中,而没有调用htmlspecialchars(),如果值包含类似<的HTML特殊字符,则会失败(可能具有安全影响)。 - bobince
3个回答

3
修正您的XML,它无效。XML文件只能有一个根元素。
有效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。它是无效的。此外,他应该通过验证器检查他的XML。

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

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

然后请指导您的老师查看维基百科:http://en.wikipedia.org/wiki/Root_element。同时告诉他通过验证器验证他的XML:http://validator.w3.org/#validate_by_input - dtech
是的,现在我明白了。非常感谢! - Dianna
我有同样的问题,实际上政府正在使用这种混乱......所以他们不会修复它......我实际上需要一种读取数百万个具有多个根元素的XML文件的方法。 - Egon Stetmann.

3

之前的回答都不太准确。XML规范定义了多种实体:文档实体、外部解析实体、文档类型定义等等。你的例子不是一个良好格式化的文档实体,这通常是XML解析器被要求解析的内容。然而,它是一个良好格式化的外部解析实体。处理良好格式化的外部解析实体的方法是从一个类似这样的骨架文档实体中引用:

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

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

0

由于这是一个无效的xml文件,您可以尝试以下技巧。

  • 在第二行插入一个虚拟的起始标签,如<dummy>
  • 最后以</dummy>结束

愉快地解析吧 ;)


不好的建议,他应该修复他的XML模式,而不是像这样做一个技巧。 - dtech
我正在尝试使用PHP读取这个XML文件,但是我有两个根元素。他应该知道这一点。我很生气为什么会被downvote?@dtech - Kowser
正如我所说,我认为在没有任何上下文的情况下提供这种解决方案是非常糟糕的建议。这应该是你最后的选择,而不是你首选的快速修复。 - dtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接