2013-11-02 4 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-й массив

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

из этих XMLs, я хочу, чтобы скопировать все подходящие теги в новом массиве .... я пытаюсь сделать это с помощью рекурсивной функции, ....

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? Как сказал Хакре, таких массивов не существует, но вы можете построить массив из одного. Это то, что вы пытаетесь сделать? – Machavity

ответ

0

Из псевдокода, который вы опубликовали, похоже, что вы хотите скопировать детей из одного элемента xml в другой. Поскольку я использую другой парсер, я ему немного по-другому, но то же самое:

  1. Найти все элементы для копирования.
    1. Найти элемент для копирования на основе найденного для копирования.
    2. Удалите всех детей элемента для копирования.
    3. Скопируйте все дети из в

Я делаю это здесь с DOMDocument, как это хорошо подходит для специальных операций, как например:

$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)); 

и дает:

<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

Смежные вопросы