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

如何使用PHP解析具有多个根元素的XML?,php,xml,parsing,root,Php,Xml,Parsing,Root,我试图使用PHP读取这个XML文件,我有两个根元素。我用PHP编写的代码只读取一个根元素,当我添加另一个()时,它会给我一个错误。 我想这样做:if($xml->action==“register”)然后打印所有参数 这是我的XML文件: <?xml version='1.0' encoding='ISO-8859-1'?> <action>register</action> <paramters> <name>Johnny B

我试图使用PHP读取这个XML文件,我有两个根元素。我用PHP编写的代码只读取一个根元素,当我添加另一个(
)时,它会给我一个错误。 我想这样做:
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>

登记
约翰尼B
约翰
这是我的PHP脚本:

<?php
$xml = simplexml_load_file("test.xml");

echo $xml->getName() . "<br />";

foreach($xml->children() as $child)
{
    echo $child->getName() . ": " . $child . "<br />";
}
?>
getName()。“
”; foreach($xml->children()作为$child) { echo$child->getName()。“:”$child。“
”; } ?>

我真的不知道如何做所有这些…

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

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

$xmlstring = str_replace(
    array('<action>','</paramters>'),
    array('<root><action>', '</paramters></root>'),
    $xmlstring
);
$xmlstring=str\u replace(
数组(“”,,),
数组(“”,,),
$xmlstring
);

由于它是一个无效的
xml文件,您可以执行以下技巧

  • 在第二行插入一个虚拟开始标记,如
  • 最后用

快乐解析;)

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

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

&e;

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

您的XML无效。XML文件只能有1个根节点,这是格式不正确的,因此不是XML。修复产生它的任何东西。此外,您在没有对输出字符串调用
htmlspecialchars()
的情况下回显HTML,这将失败(可能会带来安全隐患)。如果值包含HTML特殊字符,如
错误建议,他应该只修复他的XML shema,而不是像这样做“我试图使用PHP读取这个xml文件,我有两个根元素。“他应该知道这一点。我很生气为什么这被否决了@我说,我认为在没有任何上下文的情况下给出这种解决方案是非常糟糕的建议。这应该是你的最后手段,而不是第一个快速解决方法。然后将你的老师指向维基百科:。还告诉他将XML放入验证器:是的,现在它有意义了。非常感谢你!哈哈,我也有同样的问题,事实上政府正在使用这种混乱。。。。所以他们不会修复它。。。。我实际上需要一种方法来读取具有多个根元素的数百万XML
$xmlstring = str_replace(
    array('<action>','</paramters>'),
    array('<root><action>', '</paramters></root>'),
    $xmlstring
);
<!DOCTYPE wrapper [
<!ENTITY e SYSTEM "my.xml">
]>
<wrapper>&e;</wrapper>