2016-12-13 12 views
0

本当にシンプルで簡単な解決策を使用してXMLファイルを配列に変換する必要があります。この1は私に良い探していた。一貫性のないXML解析

json_decode(json_encode(simplexml_load_string($xmlContent, "SimpleXMLElement", LIBXML_NOCDATA)), true); 

これに伴う問題は、それが子供一人当たりの連想配列からなるインデックス付き配列として複数の子を扱いますが、それは親タグで唯一の子供がいた場合、それはdoesnのことです1つの要素でインデックス配列を作成し、assoc配列を直接親タグ要素に配置します。これらのシナリオの出力が一貫している必要があります。私。最初にインデックスされた配列は、子の数量に依存しません。私の目的は、解析後の一貫したスキーマです。

複数の子の例:

入力:

<PICK_NOTE_LINES> 
      <LINE> 
      <PICK_LINE_NUM>1</PICK_LINE_NUM> 
      <PRODUCT_CODE>3342</PRODUCT_CODE> 
      <BATCH_CODE></BATCH_CODE> 
      <QUANTITY>1</QUANTITY> 
      </LINE> 
      <LINE> 
      <PICK_LINE_NUM>2</PICK_LINE_NUM> 
      <PRODUCT_CODE>5285</PRODUCT_CODE> 
      <BATCH_CODE></BATCH_CODE> 
      <QUANTITY>1</QUANTITY> 
      </LINE> 
</PICK_NOTE_LINES> 

出力(LINEの親要素でインデックス付きの配列をしています):

['PICK_NOTE_LINES'=>['LINE'=>[['PICK_LINE_NUM'=>1, ...],['PICK_LINE_NUM'=>2, ...]]] 

1子の例:

<PICK_NOTE_LINES> 
     <LINE> 
     <PICK_LINE_NUM>1</PICK_LINE_NUM> 
     <PRODUCT_CODE>3342</PRODUCT_CODE> 
     <BATCH_CODE></BATCH_CODE> 
     <QUANTITY>1</QUANTITY> 
     </LINE> 
    </PICK_NOTE_LINES> 

出力(ライン親要素で連想配列):

['PICK_NOTE_LINES'=> ['LINE'=>['PICK_LINE_NUM'=>1, ...]]] 

が、それは常にそれが唯一の子供の場合でも、インデックス付きの配列に子供を入れて取得することが可能ですか?それが不可能な場合は、一貫した出力を得るために何が使えますか?

+0

明らかに、現在のコードでは不可能です。 –

+0

@u_mulderおそらくそれを可能にするパーサーオプションがいくつかあると思いました。 – Sergey

答えて

0

実際には構文解析は非常に一貫していますが、JSONにはXMLと同じフォーマット機能がないため、変換は制限されています。

ここでは、一般的なコンバーターが複数の子(同じ名前の子)である可能性があるかどうかを知ることができないため、リクエストは機能しません。とにかく配列を作成するなら、それはANY要素(親ノードでさえPICK_NOTE_LINESのようなものでさえ)に対してこれを行うでしょう。 JsonMLのようないくつかのJSONベースのフォーマットは、実際にそういったことをしています。

SimpleXML自体では、各要素を1つのノードまたはリストとして扱うことができます。データにアクセスして問題を回避する方法を知っています。

特定のJSON出力を作成する場合は、独自の変換ロジックを作成し、XMLを読み込んでオブジェクト/配列構造を作成する必要があります。

一般的な変換を避けることを強くお勧めします。 XMLを読み、SimpleXMLElementを保持している場合、変換によってデータとAPIの機能が失われることになります。

特定のJSON出力が必要な場合は、独自のロジックを使用して生成します。このようにして、構造が必要なものであることを確かめることができます。

1

私はsaber/xmlライブラリを使用することになりました。いくつかのコードの行と、それは私が必要とする構造を提供します:

$this->serviceSabre\Xml\Serviceある
$this->service->elementMap = [ 
      '{}DOCUMENT' => $assocParser, 
      '{}DATA' => $assocParser, 
      '{}CONSIGNMENTS' => $indexParser, 
      '{}PICK_NOTE_LINES' => function ($reader) use ($makeArray) { 
       $lines = []; 
       $children = $reader->parseInnerTree(); 
       foreach ($children as $child) { 
        $lines[] = $makeArray($child['value']); 
       } 
       return $lines; 
      }, 
     ]; 

は、$ assocParserと$ indexParserは$makeArrayクロージャを使用してLIBの標準出力から、私は必要なアレイ構造を作成します。

関連する問題