2

PHP で XML ドキュメントまたはフラグメントを配列に変換することに関する多数の記事と 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 で XML フラグメントを配列に変換するときに「タグの順序」を維持するにはどうすればよいでしょうか?

4

1 に答える 1

2

saysimpleXMLまたはで使用できるフラグがないことを確認してjson_decodeください。XMLがそれを維持することを意図しているとは思いません。構造はそれを伝えるためのものではなく、いかに悪い設計につながるかがわかります。sequenceXML に固有のものですが、XSDで を使用することでこれを回避できます。しかし、あなたのデータは DOM のように見えます。

回避策として、それをDOM ドキュメントとして解析してステップスルーすることを検討しましたか? それを活用して自分で解析するにはコードが多すぎません。

于 2012-09-14T01:57:50.043 に答える