2013-09-24 3 views
0

В настоящее время я создаю динамический генератор XML, используя записи, которые я получаю из базы данных. Я возвращаемый объект из запроса в базу данных в $ res_detailСоздать xml с помощью simpleXML

Array 
( 
[0] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 1 
    [MWSCDName] => Root 
    [MWSCDValue] => message 
    [MWSCDRoot] => 1 
    [MWSCDisParent] => 1 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 
    [MWSCDAttribute] => 
    [MWSCDDefaultValue] => 
    [MWSCDStatus] => 1 
) 
[1] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 2 
    [MWSCDName] => User ID 
    [MWSCDValue] => UserID 
    [MWSCDRoot] => 
    [MWSCDisParent] => 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 1 
      [MWSCDDefinedValue] => 5 
    [MWSCDAttribute] => 1 
    [MWSCDDefaultValue] => 1 
    [MWSCDStatus] => 1 
) 
[2] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 3 
    [MWSCDName] => Password 
    [MWSCDValue] => Password 
    [MWSCDRoot] => 
    [MWSCDisParent] => 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 1 
      [MWSCDDefinedValue] => 6 
    [MWSCDAttribute] => 1 
    [MWSCDDefaultValue] => 2 
    [MWSCDStatus] => 1 
) 
[3] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 4 
    [MWSCDName] => Document 
    [MWSCDValue] => Document 
    [MWSCDRoot] => 
    [MWSCDisParent] => 2 
    [MWSCDTier] => 1 
    [MWSCDParent] => 1 
    [MWSCDNode] => 
    [MWSCDAttribute] => 
    [MWSCDDefaultValue] => 
    [MWSCDStatus] => 1 
) 
[4] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 5 
    [MWSCDName] => Merchant ID 
    [MWSCDValue] => MerchantID 
    [MWSCDRoot] => 
    [MWSCDisParent] => 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 2 
    [MWSCDAttribute] => 2 
    [MWSCDDefaultValue] => XXXXXX-5348-XXXX-XXXX-4a553aa6fe94 
    [MWSCDStatus] => 1 
) 
[5] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 6 
    [MWSCDName] => Document Documentation 
    [MWSCDValue] => DocDefinition 
    [MWSCDRoot] => 
    [MWSCDisParent] => 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 2 
    [MWSCDAttribute] => 2 
    [MWSCDDefaultValue] => XXXXXXXX-XXXX-4463-9EB0-36B992664AE4 
    [MWSCDStatus] => 1 
) 
[6] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 7 
    [MWSCDName] => Detail 
    [MWSCDValue] => Dtl 
    [MWSCDRoot] => 
    [MWSCDisParent] => 3 
    [MWSCDTier] => 
    [MWSCDParent] => 1 
    [MWSCDNode] => 
    [MWSCDAttribute] => 
    [MWSCDDefaultValue] => 
    [MWSCDStatus] => 1 
) 
[7] => stdClass Object 
( 
    [MWSCID] => 2 
    [MWSCDID] => 8 
    [MWSCDName] => Customer ID 
    [MWSCDValue] => CustID 
    [MWSCDRoot] => 
    [MWSCDisParent] => 
    [MWSCDTier] => 
    [MWSCDParent] => 
    [MWSCDNode] => 3 
    [MWSCDAttribute] => 3 
    [MWSCDDefaultValue] => XXXX-PP 
    [MWSCDStatus] => 1 
) 
) 

* Примечание: MWSCDParent Колонка: Указывает, какой родитель этот узел принадлежит

MWSCDisParent Колонка: Сообщает, если этот узел является родителем

MWSCDValue колонка: будет имя узла

MWSCDAttribute колонка будет указывать на запись является атрибутом для MWSCDNode

Я пытаюсь сделать это, чтобы произвести и XML с этим выход:

<Message UserID="TestUser" Password="TestPassword"> 
    <Document MerchantID="XXXXXXXX-5348-XXXX-XXXX-4a553aa6fe94" DocDefinition="XXXXXXXX-XXXX-4463-9EB0-36B992664AE4"> 
    <Dtl CustID="XXXX-PP" RefID="></Dtl> 
    </Document> 
</Message> 

Я попытался:

$res_detail = $this->merchantwsconfigdetail_model->get_ws_detail(2); 
$res_user = $this->merchantwslogin_model->user_list(' WHERE MWSCID='.$res_detail[0]->MWSCID,'','');   

$xmlDoc = new DOMDocument; 

$xmlDoc->formatOutput = true; 

for($a=0;$a<count($res_detail);$a++): 
{ 
    if($res_detail[$a]->MWSCDRoot == "1"): 
    { 
     $root = $xmlDoc->appendChild($xmlDoc->createElement($res_detail[$a]->MWSCDValue)); 
     $out_xml = simplexml_import_dom($xmlDoc); 

     for($b=0;$b<count($res_detail);$b++): 
     { 
      if(!empty($res_detail[$b]->MWSCDAttribute) && $res_detail[$b]->MWSCDNode == "1"): 
      { 
       $val = ""; 
       if(!empty($res_detail[$b]->MWSCDDefinedValue)): 
       { 
        if($res_detail[$b]->MWSCDDefinedValue == "5"): //Username 
        { 
         $val = $res_user[0]->MWSLUsername; 
        } 
        elseif($res_detail[$b]->MWSCDDefinedValue == "6"): 
        { 
         $val = $res_user[0]->MWSLPassword; 
        } 
        endif; 
       $attr[$b] = simplexml_import_dom($root); 
       $attr[$b]->addAttribute($res_detail[$b]->MWSCDValue,$val); 
       } 
       endif; 

      } 
      endif; 
     } 
     endfor; 
    } 
    endif; 
} 
endfor; 

     $ctr = 0; 
     for($a=0;$a<count($res_detail);$a++): 
     { 
      if($res_detail[$a]->MWSCDRoot <> "1" && !empty($res_detail[$a]->MWSCDParent)): 
      { 
       $node[$ctr] = simplexml_import_dom($root); 
       $node[$ctr]->addChild($res_detail[$a]->MWSCDValue)->addAttribute('test','tex'); 
       $ctr++; 
      } 
     } 

Я получаю:

<message password="Password" userid="TestUser"> 
    <document test="tex"> 
     <dtl test="tex"></dtl> 
    </document> 
</message> 

, который нормально, но проблема возникает, когда в MWSCDParent больше 1, что должно выглядеть примерно так:

<a> 
    <b attr="attrib_val1"> 
     <d attr="attrib_val1> *it goes deeper 
      <e attr="attrib_val1>*here is the problem!? and the attribute is being inherited as well 
      </e> 
     </d> 
    </b> 
    <c> *problem is here. I cant pinpoint it to be a child as well 
    </c> 
</a> 

я установить MWSCDParent ранее tocheck если она изменится, соответствующим значению в базе данных, но мне кажется, что

$node[$ctr] = simplexml_import_dom($root); 
$node[$ctr]->addChild($res_detail[$a]->MWSCDValue)->addAttribute('test','tex'); 
$ctr++; 

делает ребенок идти глубже и глубже, как можно сохранить позиции в пределах родительский узел? или если я хочу, чтобы он углубился в узел?

ответ

0

Решена проблема, я заметил, чтобы решить проблему установки положения ребенка ли быть внутри родителя или быть другим родителем и иметь ребенка:

 $node[0] = $xmlDoc->createElement('message'); 
     $xmlDoc->appendChild($node[0]); 

     $node[1] = $xmlDoc->createElement('document'); 
     $node[0]->appendChild($node[1]); 

     $node[2] = $xmlDoc->createElement('dtl'); 
     $node[0]->appendChild($node[2]); 

установить:

$node[X] = $xmlDoc->createElement('node_name'); //create the element 
$node[Y]->appendchild($node[X]); // append or insert the $node[$X] to that node if using create element in node X it will produce a child, if createAttribute, it will add attributes into the node. 

и код, чтобы сделать необходимое XML, чтобы быть динамически генерироваться:

 $xmlDoc = new DOMDocument('1.0'); 

     $xmlDoc->formatOutput = true; 
     $root_name = ""; 
     $node = array(); 
     $node_ctr = "1"; 

     for($a=0;$a<count($res_detail);$a++): 
     { 
      /* GET ROOT NODE */ 
      if($res_detail[$a]->MWSCDRoot == "1"): 
      { 
       $node[0] = $xmlDoc->createElement($res_detail[$a]->MWSCDValue); 
       $xmlDoc->appendChild($node[0]); 
       for($b=0;$b<count($res_detail);$b++): 
       { 
        /* GET ROOT ATTRIBUTE IF ANY */ 
        if($res_detail[$b]->MWSCDAttribute == "1"): 
        { 
         $attr = $xmlDoc->createAttribute($res_detail[$b]->MWSCDValue); 
         $attr->value = $this->xml_functions->get_value($res_detail[$b]->MWSCDID,$res_detail,$res_user); 
         $node[0]->appendChild($attr); 
        } 
        endif; 
       } 
       endfor; 
      } 
      endif; 

      if(!empty($node[0])): 
      { 
       if($res_detail[$a]->MWSCDParent == "1"): 
       { 
        $node[$node_ctr] = $xmlDoc->createElement($res_detail[$a]->MWSCDValue); 
        $node[0]->appendChild($node[$node_ctr]); 
        $node_ctr++; 
        for($x=0;$x<count($res_detail);$x++): 
        { 
         if($res_detail[$x]->MWSCDAttribute == $node_ctr): 
         { 
          $attr = $xmlDoc->createAttribute($res_detail[$x]->MWSCDValue); 
          $attr->value = $this->xml_functions->get_value($res_detail[$x]->MWSCDID,$res_detail,$res_user); 
          $node[1]->appendChild($attr); 
         } 
         endif; 
        } 
        endfor; 
       } 
       elseif($res_detail[$a]->MWSCDParent <> "1" && !empty($res_detail[$a]->MWSCDParent)): 
       { 
        $node[$node_ctr] = $xmlDoc->createElement($res_detail[$a]->MWSCDValue); 
        $node[$node_ctr-1]->appendChild($node[$node_ctr]); 
        $node_ctr++; 
        for($x=0;$x<count($res_detail);$x++): 
        { 
         if($res_detail[$x]->MWSCDAttribute == $node_ctr): 
         { 
          $attr = $xmlDoc->createAttribute($res_detail[$x]->MWSCDValue); 
          $attr->value = $this->xml_functions->get_value($res_detail[$x]->MWSCDID,$res_detail,$res_user); 
          $node[$node_ctr-1]->appendChild($attr); 
         } 
         endif; 
        } 
        endfor; 

       } 
       endif; 
      } 
      endif; 
     } 
     endfor; 

OUT PUT:

<message password="Password" userid="TestUser"> 
    <document merchantid="" docdefinition=""> 
     <dtl ref5="" custid="" refid="" filldate="" ref1="" ref2="" ref3="" ref4=""> </dtl> 
    </document> 
</message> 

* Дополнительное примечание: я должен был ORDER BY столбца в запросе, чтобы заставить его работать

ORDER BY 
`merchantwsconfigdetail`.`MWSCDRoot` DESC, 
`merchantwsconfigdetail`.`MWSCDisParent` DESC, 
`merchantwsconfigdetail`.`MWSCDParent` DESC, 
`merchantwsconfigdetail`.`MWSCDNode` ASC, 
`merchantwsconfigdetail`.`MWSCDAttribute` ASC 
Смежные вопросы