0

多くの単一製品で構成される XML ファイルを解析してフラット化する必要があります。XML は完全に文書化されており、SimpleXML を使用して PHP で XML を簡単に解析できます。以下のコードを参照して、単一の製品から配列を作成する方法を確認してください。次に、必要なすべてのキーにアクセスし、データを SQL データベースに保存します。

私の問題は、さまざまな子ノードを処理する方法です。提供されている XML スニペットでわかるように、"Name" ノードは 1 つだけの場合もありますが、2 つ以上ある場合もあります。そのようなノードが複数ある場合、「NameType」に従って、どの「NameText」を使用するかを決定する必要があります。「価格」ノードでも同じことが起こります。

<Product>
  <Id>123</Id>
  <Name>
    <NameType>3</NameType>
    <NameText>Hello World</NameText>
  </Name>
  <Price>
    <Country>US</Country>
    <Amount>9.90</Amount>
  </Price>
</Product>

<Product>
  <Id>124</Id>
  <Name>
    <NameType>1</NameType>
    <NameText>Goodbye Cruel World</NameText>
  </Name>
  <Name>
    <NameType>3</NameType>
    <NameText>Goodbye Cruel World, I'm Leaving You Today</NameText>
  </Name>
  <Name>
    <NameType>9</NameType>
    <NameText>Goodbye</NameText>
  </Name>
  <Price>
    <Country>CAN</Country>
    <Amount>27.90</Amount>
  </Price>
  <Price>
    <Country>US</Country>
    <Amount>19.90</Amount>
  </Price>
</Product>

この問題に対処するためのコードを次に示します。XML を連想配列に変換し、必要なデータを取得するために多くの if-magic を使用します。提供されたコードは、最初の製品の例では「Hello World」を出力し、2 番目の製品では「Goodbye Cruel World」を出力します。

$xml = simplexml_load_string($product);
$json = json_encode($xml);
$arr = json_decode($json, True);
// $arr['Name']['NameText'] contains the single NameText for this product in example one
// $arr['Name'][0]['NameText'] contains the first of three NameTexts in example two

if( array_key_exists(0, $arr['Name']) ) {
  foreach( $arr['Name'] as $n) {
    if( $n['NameType'] == 1 ) {
      echo $n['NameText']."\n";
      break;
    } elseif ( $n['NameType'] == 3 ) {
      echo $n['NameText']."\n";
      break;
    }
  }
} else {
  echo $arr['Name']['NameText']."\n";
}

このコードが機能している間は、複数回発生する可能性のあるすべてのノードをケースバイケースで分析することにあまり満足していません。そして、NameType "1" が常に NameType "3" の前に来ると仮定すると、子ノードの "正しい" 順序に依存する必要さえあります。そのため、よりスマートなソリューションが世の中にあることを願っています。

親ノードごとに子ノードの量が異なる XMLの質問は似ているように見えますが、実際には、子ノードの量が異なる部分と、特別な子ノードを選択するタスクには対応していません。

4

2 に答える 2