2016-12-13 81 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的标准输出需要。