simplexml_load_string 丢失标签的顺序

simplexml_load_string loses the order of tags

我有以下 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 "input" 的数组和一个 2 "label" 的数组,但我不知道它们在 XML 中的顺序。

有办法得到那个订单吗?

So I get an array of ...

不,你不知道。 SimpleXML 是对象,不是数组;更重要的是,它是一个旨在用作 API 的对象,而不是具有固定属性的对象。当您使用 print_rvar_dump 或类似的任何东西时,它表示自己好像是一个内部有一堆数组的对象,但实际上并不是这样。

它显示的原因是,如果您访问 $simplexml_object->input,您可以按照它们出现的顺序遍历所有 <input> 元素,这通常很有用。

但是,要遍历所有元素,不管它们的标签名称如何,请使用 the ->children() method and then check the name of each using the ->getName() method,例如:

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