simplexml_load_string теряет порядок тегов

У меня есть следующий XML:

<mobapp>
<form>
<input type="text" name="target" id="target" value="" maxlength="8" required="true" pattern="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"/>
<label for="target"> Phone number</label>
<input type="number" name="amount" id="amount" min="0" maxlength="16" required="true"/>
<label for="amount"> Amount to load:</label>
</form>
</mobapp>

Когда я использую simplexml_load_string($theXML) Я получаю следующее:

object(SimpleXMLElement)#150 (3) {
["input"]=>
array(2) {
[0] => object(SimpleXMLElement)#146 (1) {
["@attributes"]=> [... removed for brevity ...]
}
[1] => object(SimpleXMLElement)#146 (1) {
["@attributes"]=> [... removed for brevity ...]
}
}
["label"]=>
array(2) {
[0] => [... removed for brevity ...]
[1] => [... removed for brevity ...]

}

(Я удалил все атрибуты, чтобы было проще понять)

Поэтому я получаю массив из 2 «входных данных» и массив из 2 «меток», но я не знаю, в каком порядке они были в XML.

Есть ли способ получить этот заказ?

0

Решение

Итак, я получаю массив …

Нет, ты не SimpleXML — это объект, а не массив; более того, это объект, предназначенный для использования в качестве API, а не объект с фиксированными свойствами. Когда вы используете print_r, var_dumpили что-то в этом роде, он представляет себя как объект с кучей массивов внутри, но на самом деле это не то, что происходит.

Это показывает, что если вы получаете доступ $simplexml_object->inputВы можете просмотреть все <input> элементы, в порядке их появления, что часто бывает полезно.

Однако, чтобы перебрать все элементы, независимо от их имени тега, используйте ->children() метод а затем проверьте имя каждого использования ->getName() метод, например.:

foreach ( $simplexml_object->children() as $node ) {
$tag_name = $node->getName();
$text_content = (string)$node;
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]