2016-12-13 41 views
0

我需要使用一些非常簡單和快速的解決方案將XML文件轉換爲數組。這人看對我好:不一致的XML解析

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

這樣做的問題在於,它把多個孩子由每名兒童的關聯數組的索引數組,但如果只有一個孩子在家長的標籤,這不是用一個元素創建一個索引數組,並將一個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, ...]]] 

一個兒童的例子:

<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格式相同的功能。

您的請求無法正常工作,因爲通用轉換器無法知道這裏是否有可能是多個孩子(具有相同的名稱)。如果它會創建數組,它會爲任何元素(甚至像父節點PICK_NOTE_LINES)這樣做。像JsonML這樣的一些基於JSON的格式實際上就是這樣做的。

SimpleXML本身允許您將每個元素視爲單個節點或列表。您知道如何訪問數據,因此避免了這個問題。

如果您希望創建特定的JSON輸出,則需要編寫自己的轉換邏輯,讀取XML並創建對象/數組結構。

我強烈建議避免通用轉換。如果您正在閱讀XML,請保留SimpleXMLElement,轉換意味着您將丟失數據和API功能。

如果您需要特定的JSON輸出,請使用您自己的邏輯生成它。這樣你就可以確定結構是你需要的結構。

1

我已經結束了使用saber/xml庫。的幾行代碼,這讓我的結構,我需要:

$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; 
      }, 
     ]; 

其中$this->serviceSabre\Xml\Service,$ assocParser和$ indexParser創建數組結構,從我使用$makeArray封閉的lib的標準輸出需要。