Implexml_Load_string丢失标记的顺序

2022-08-12 00:00:00 xml php simplexml

我有以下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中的顺序。

有没有办法拿到那个订单?


解决方案

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

不,您不需要。SimpleXML是一个对象,而不是数组;更重要的是,它是一个被设计为用作API的对象,而不是具有固定属性的对象。当您使用print_rvar_dump或类似的东西时,它将其自身表示为内部带有一串数组的对象,但实际情况并非如此。

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

但是,要遍历所有元素,而不考虑它们的标记名,请使用the ->children() method,然后使用the ->getName() method检查每个元素的名称,例如:

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

相关文章