我已经阅读了大量有关将XML文档或片段转换为PHP数组的文章和Stack Overflow问题,但到目前为止我所读过的都没有解决我的具体问题。这是我的困境,前面是一个示例XML片段:
<category>
<template>
<random>
<li>And a good</li>
<li>Pleasant</li>
<li>Good</li>
<li>Fantabulous</li>
</random>
<set name="TOD"><srai>time of day</srai></set> to you, <get name="name" />.
<random>
<li>How are you?</li>
<li>To what do I owe the pleasure of this visit?</li>
<li>May your Athlete's Foot be under control, and may the flying monkeys never come to take your dog!</li>
<li>I trust your <get name="TOD" /> is going well?</li>
<li>May your <get name="TOD" /> be as pleasant as possible.</li>
</random>
</template>
</category>
这是我的脚本将要处理的一些XML的真实世界示例。需要保留XML标记的序列顺序,因为解析后的结果需要正确连接才能提供正确的结果。到目前为止,所有将XML片段转换为数组的方法都创建了不再包含正确顺序的数组。举个例子,这里是上面XML的var转储,一旦转换成数组:
Template array Var Dump:
array(4) {
["random"]=>
array(2) {
[0]=>
array(1) {
["li"]=>
array(4) {
[0]=>
array(1) {
["text"]=>
string(10) "And a good"
}
[1]=>
array(1) {
["text"]=>
string(8) "Pleasant"
}
[2]=>
array(1) {
["text"]=>
string(4) "Good"
}
[3]=>
array(1) {
["text"]=>
string(11) "Fantabulous"
}
}
}
[1]=>
array(1) {
["li"]=>
array(5) {
[0]=>
array(1) {
["text"]=>
string(12) "How are you?"
}
[1]=>
array(1) {
["text"]=>
string(44) "To what do I owe the pleasure of this visit?"
}
[2]=>
array(1) {
["text"]=>
string(97) "May your Athlete's Foot be under control, and may the flying monkeys never come to take your dog!"
}
[3]=>
array(2) {
["text"]=>
array(2) {
[0]=>
string(12) "I trust your"
[1]=>
string(14) "is going well?"
}
["get"]=>
array(1) {
["@attributes"]=>
array(1) {
["name"]=>
string(3) "TOD"
}
}
}
[4]=>
array(2) {
["text"]=>
array(2) {
[0]=>
string(8) "May your"
[1]=>
string(27) "be as pleasant as possible."
}
["get"]=>
array(1) {
["@attributes"]=>
array(1) {
["name"]=>
string(3) "TOD"
}
}
}
}
}
}
["set"]=>
array(2) {
["@attributes"]=>
array(1) {
["name"]=>
string(3) "TOD"
}
["srai"]=>
array(1) {
["text"]=>
string(11) "time of day"
}
}
["text"]=>
array(2) {
[0]=>
string(7) "to you,"
[1]=>
string(1) "."
}
["get"]=>
array(1) {
["@attributes"]=>
array(1) {
["name"]=>
string(4) "name"
}
}
}
可以看出,数组在创建时“丢失”了XML片段的序列顺序,并且您无法以线性方式迭代数组以获得正确的响应。这是我的问题的关键,以及我想要“修复”的内容。
我在这个例子中使用的方法是json_decode(json_encode($xml), true)
,但是我使用了其他更复杂的脚本函数,结果几乎相同。那么,就像我在这篇文章的标题中提到的那样,在将PHP片段转换为PHP中的数组时,如何保留“标记顺序”?
答案 0 :(得分:2)
非常确定没有可用的标记simpleXML
或json_decode
。我不认为XML旨在保留它。该结构无意表达,可以看出它如何导致糟糕的设计。特定于XML,您可以通过在XSD中使用sequence
来解决这个问题。但是你的数据看起来更像是一个DOM。
作为一种解决方法,您是否已将其作为DOM Document进行解析并逐步完成?没有太多的代码可以自己解析它。