PHP的SimpleXML不保持不同元素类型之间的顺序
发布时间:2020-12-13 21:51:21 所属栏目:PHP教程 来源:网络整理
导读:据我所知,当你在 XML文档树中同一级别有多种类型的元素时,PHP的SimpleXML(包括SimpleXMLElement和SimpleXMLIterator)都不会保持元素的顺序,因为它们彼此相关,只在每个元素. 例如,请考虑以下结构: catalog book titleHarry Potter and the Chamber of Secret
|
据我所知,当你在
XML文档树中同一级别有多种类型的元素时,PHP的SimpleXML(包括SimpleXMLElement和SimpleXMLIterator)都不会保持元素的顺序,因为它们彼此相关,只在每个元素.
例如,请考虑以下结构: <catalog>
<book>
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
</book>
<book>
<title>Great Expectations</title>
<author>Charles Dickens</author>
</book>
</catalog>
如果我有这个结构并使用SimpleXMLIterator或SimpleXMLElement来解析它,我最终得到一个类似于下面的数组: Array (
[book] => Array (
[0] => Array (
[title] => Array (
[0] => Harry Potter and the Chamber of Secrets
)
[author] => Array (
[0] => J.K. Rowling
)
)
[1] => Array (
[title] => Array (
[0] => Great Expectations
)
[author] => Array (
[0] => Charles Dickens
)
)
)
)
这样就好了,因为我只有书本元素,并且它在这些元素中保持正确的顺序.但是,我也说我添加了电影元素: <catalog>
<book>
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
</book>
<movie>
<title>The Dark Knight</title>
<director>Christopher Nolan</director>
</movie>
<book>
<title>Great Expectations</title>
<author>Charles Dickens</author>
</book>
<movie>
<title>Avatar</title>
<director>Christopher Nolan</director>
</movie>
</catalog>
使用SimpleXMLIterator或SimpleXMLElement进行解析将导致以下数组: Array (
[book] => Array (
[0] => Array (
[title] => Array (
[0] => Harry Potter and the Chamber of Secrets
)
[author] => Array (
[0] => J.K. Rowling
)
)
[1] => Array (
[title] => Array (
[0] => Great Expectations
)
[author] => Array (
[0] => Charles Dickens
)
)
)
[movie] => Array (
[0] => Array (
[title] => Array (
[0] => The Dark Knight
)
[director] => Array (
[0] => Christopher Nolan
)
)
[1] => Array (
[title] => Array (
[0] => Avatar
)
[director] => Array (
[0] => James Cameron
)
)
)
)
因为它以这种方式表示数据,所以我似乎无法分辨XML文件中的书籍和电影的顺序实际上是书籍,电影,书籍,电影.它只是将它们分为两类(尽管它保持每个类别中的顺序). 有没有人知道一个变通方法,或者没有这种行为的不同XML解析器? 解决方法
“如果我…使用SimpleXMLIterator或SimpleXMLElement来解析它,我最终会得到一个数组” – 不,你不会,你会得到一个对象,它在某些方面恰好像一个数组.
该对象的递归转储的输出与迭代它的结果不同. 特别是,运行foreach($some_node-> children()为$child_node)将按照它们在文档中出现的顺序为您提供节点的所有子节点,而不管名称如何,如this live code demo所示. 码: $xml = <<<EOF
<catalog>
<book>
<title>Harry Potter and the Chamber of Secrets</title>
<author>J.K. Rowling</author>
</book>
<movie>
<title>The Dark Knight</title>
<director>Christopher Nolan</director>
</movie>
<book>
<title>Great Expectations</title>
<author>Charles Dickens</author>
</book>
<movie>
<title>Avatar</title>
<director>Christopher Nolan</director>
</movie>
</catalog>
EOF;
$sx = simplexml_load_string($xml);
foreach ( $sx->children() as $node )
{
echo $node->getName(),'<br />';
}
输出: book movie book movie (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
