如何保留"标记顺序"在PHP中将XML片段转换为数组时?

时间:2012-09-14 01:45:18

标签: php xml

我已经阅读了大量有关将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中的数组时,如何保留“标记顺序”?

1 个答案:

答案 0 :(得分:2)

非常确定没有可用的标记simpleXMLjson_decode。我不认为XML旨在保留它。该结构无意表达,可以看出它如何导致糟糕的设计。特定于XML,您可以通过在XSD中使用sequence来解决这个问题。但是你的数据看起来更像是一个DOM。

作为一种解决方法,您是否已将其作为DOM Document进行解析并逐步完成?没有太多的代码可以自己解析它。