simplexml_load_string失去了标签的顺序

Dan*_*ykt 0 php xml simplexml 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>
Run Code Online (Sandbox Code Playgroud)

当我使用时,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 ...]

}
Run Code Online (Sandbox Code Playgroud)

(我删除了所有属性,使其更容易理解)

所以我得到一个2"输入"的数组和一个2"标签"的数组,但我不知道它们在XML中的顺序.

有没有办法获得该订单?

IMS*_*SoP 5

所以我得到一个......

不,你没有.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;
}
Run Code Online (Sandbox Code Playgroud)