2013-11-02 3 views
0

에서 세 번째 배열에 두 개의 XML 배열을 병합 ... 첫 번째 XML struxture는어떻게 두 개의 XML 배열을 가지고 있고, 나는 세 번째 배열이 배열을 병합 할 PHP

$current = '<forms id="frm16648"> 
    <group ref="" id="tarascioheader" mode="block"> 
    <label> 
    <![CDATA[Group (tarascioheader)]]> 
    </label> structure u 
    <select ref="" id="petorresp"> 
     <label> 
     <![CDATA[Select (petorresp)]]> 
     </label> 
    </select> 

및 2 인 배열은 ....

이 XMLS에서
$old = '<forms id="frm16648"> 
    <group ref="" id="tarascioheader" mode="block"> 
    <label> 
    <![CDATA[abc]]> 
    </label> 
</group> 
</forms>': 
    </group> 
</forms>'; 

, 난 .... 새로운 배열에 I는 재귀 함수에 의해이 작업을 수행하려고를 일치하는 모든 태그를 복사 할 것입니다

function merge_xmls($current, $old) 
{ 

    $cxml = str_get_html($current); 
    $oxml = str_get_html($old); 
    do 
    { 
     $tt = $cxml->first_child(); 
     if(!empty($tt) && !is_null($cxml->first_child())) 
     { 

      $x = $cxml->first_child(); 

      $this->merge_xmls($x, $cxml, $oxml); 
     } 
     if(empty($tt)) 
     { 
      $cid = $cxml->id; 
      $oid = $oxml -> find('#'.$cid); 
      if(!is_null($oid)) 
      { 
       $cxml -> innerHTML = $oxml -> innerHTML; 
      } 
     } 
     $cxml = $cxml->next_sibling(); 
    } 
    while(!empty($cxml) && !is_null($cxml)); 
} 
+0

예상되는 출력은 무엇입니까 :이 도움이

희망은, 예 나를 위해 당신의 데이터를이 방식으로 작동? –

+0

PHP에는 * XML Arrays * 같은 것이 없습니다. 너 무슨 소리 야? 또한 '$ this'가 없습니다 - 필요한만큼 작은 데이터와 코드로 문제를 설명하는 독립적 인 * 작업 예제를 만드십시오. – hakre

+0

SimpleXML을 사용하려고합니까? hakre가 말했듯이 XML 배열과 같은 것은 없지만 하나의 배열을 만들 수 있습니다. 그게 당신이하려는 일 이니? – Machavity

답변

0

게시 한 의사 코드에서 하나의 XML 요소의 하위 요소를 다른 요소로 복사하려는 것처럼 보입니다. 다른 구문 분석기를 사용하기 때문에 약간 다르지만 동일합니다.

  1. 복사 할 모든 요소를 ​​찾습니다.
    1. 복사 할 요소를 기반으로 복사 할 요소를 찾습니다.
    2. 복사 할 요소의 모든 하위를 제거하십시오.

      $doc = new DOMDocument(); 
      
      $copyTo = $doc->createDocumentFragment(); 
      $copyTo->appendXML($current); 
      
      $copyFrom = new DOMDocument(); 
      $copyFrom->loadXML($old); 
      
      $xpath = new DOMXPath($copyFrom); 
      
      foreach (new DOMElementFilter($copyTo->childNodes, 'forms') as $form) { 
          $id   = $form->getAttribute('id'); 
          $expression = sprintf('(//*[@id=%s])[1]', xpath_string($id)); 
          $copy  = $xpath->query($expression)->item(0); 
      
          if (!$copy) { 
           throw new UnexpectedValueException("No element with ID to copy from \"$id\""); 
          } 
      
          dom_replace_children($copy, $form); 
      } 
      

      출력은 그대로 :

      echo $doc->saveXML($doc->importNode($copyTo, TRUE)); 
      
      가 같은 같은 전용 작업에 적합한 것에 따라 나는 DOMDocument를 여기 그것을 할

로에서

  • 복사 모든 어린이

    및 제공 :

    여기 91,363,210
    <forms id="frm16648"> 
        <group ref="" id="tarascioheader" mode="block"> 
        <label> 
        <![CDATA[abc]]> 
        </label> 
    </group> 
    </forms> 
    

    도움의 루틴은 다음과 같습니다

    function dom_remove_children(DOMElement $node) 
    { 
        while ($node->firstChild) { 
         $node->removeChild($node->firstChild); 
        } 
    } 
    
    function dom_replace_children(DOMElement $from, DOMElement $into) 
    { 
        dom_remove_children($into); 
    
        $doc = $into->ownerDocument; 
    
        foreach ($from->childNodes as $child) { 
         $into->appendChild($doc->importNode($child, TRUE)); 
        } 
    } 
    

    또한 DOMElementFilter class (PHP DOM: How to get child elements by tag name in an elegant manner?를 통해)을 거기 년대 xpath_string() function (또한 shown on Stackoverflow 등). https://eval.in/59886

  • 관련 문제