2011-12-22 3 views
0

Мне нужно работать с документами XML, и мне нужно скопировать некоторые поля в другой файл XML. У меня есть это поле:Копировать атрибуты XML PHP

<cast> 
    <person name="Nanda Anand" character="" job="Director" id="589088" thumb="" department="Directing" url="http://www.themoviedb.org/person/589088" order="0" cast_id="1000"/> 
    <person name="Lynn Collins" character="" job="Actor" id="21044" thumb="http://cf2.imgobject.com/t/p/w185/berS11tKvXqTFThUWAYrH279cvn.jpg" department="Actors" url="http://www.themoviedb.org/person/21044" order="0" cast_id="1001"/> 
</cast> 

Мне нужно скопировать все элементы в другой XML, но с данными атрибутами .. я использую этот код, но он не работает:

foreach ($movies->movies->movie->cast->children() as $person) 
      { 
      $person = $cast->appendChild(
        $xmldoc->createElement(("person"), str_replace("&", "&amp;",$person))); 
      } 
+0

«Это Безразлично «работа» - это самая бесполезная информация, которую вы могли бы дать. Что не работает? Откуда вы знаете, что это не работает? Получаете ли вы сообщения об ошибках? – hoppa

+0

Прошу прощения. Я имею в виду, он просто копирует для каждого человека, которого он находит в структуре. Мне также нужно скопировать атрибуты. Можете ли вы мне помочь? – Max

+0

Так плохо и просто комментировать, чтобы увидеть ошибку с моей стороны. Вы должны думать о том, что мы здесь, чтобы помогать друг другу. – Max

ответ

3

Если вы хотите, чтобы манипулировать документ XML (т.е. добавление узлов из одного документа в другой), вы должны использовать DOMDocum ent, а не SimpleXML.

Вот код для копирования из одного документа в другой с помощью DOMDocument. Обратите внимание, что это двухэтапный процесс. Сначала импортируйте узел в документ как $ ndTemp. Во-вторых, добавьте импортированный $ ndTemp к указанному родительскому объекту (я просто использую корневой элемент documentElement, но это может быть другой узел).

Примечание: если вы просто делаете простую копию, вы можете рассмотреть возможность использования XSL, но это еще один пост ...

Входной XML (movie.xml)

<xml> 
<movie name='first'> 
    <cast> 
     <person name="Nanda Anand" character="" job="Director" id="589088" thumb="" department="Directing" url="http://www.themoviedb.org/person/589088" order="0" cast_id="1000"/> 
     <person name="Lynn Collins" character="" job="Actor" id="21044" thumb="http://cf2.imgobject.com/t/p/w185/berS11tKvXqTFThUWAYrH279cvn.jpg" department="Actors" url="http://www.themoviedb.org/person/21044" order="0" cast_id="1001"/> 
    </cast> 
</movie> 
<movie name='Second'> 
    <cast> 
     <person name="Zaphod Beeblebrox" character="" job="Director" id="589088" thumb="" department="Directing" url="http://www.themoviedb.org/person/589088" order="0" cast_id="1000"/> 
    </cast> 
</movie> 
</xml> 

PHP

<?php 
    $xml = new DOMDocument(); 
    $strFileName = "movie.xml"; 
    $xml->load($strFileName); 

    $xmlCopy = new DOMDocument(); 
    $xmlCopy->loadXML("<xml/>"); 

    $xpath = new domxpath($xml); 
    $strXPath = "/xml/movie/cast/person"; 

    $elements = $xpath->query($strXPath, $xml); 
    foreach($elements as $element) { 
     $ndTemp = $xmlCopy->importNode($element, true); 
     $xmlCopy->documentElement->appendChild($ndTemp); 
    } 
    echo $xmlCopy->saveXML(); 

?> 

Выход

<?xml version="1.0"?> 
<xml> 
    <person name="Nanda Anand" character="" job="Director" id="589088" thumb="" department="Directing" url="http://www.themoviedb.org/person/589088" order="0" cast_id="1000" /> 
    <person name="Lynn Collins" character="" job="Actor" id="21044" thumb="http://cf2.imgobject.com/t/p/w185/berS11tKvXqTFThUWAYrH279cvn.jpg" department="Actors" 
    url="http://www.themoviedb.org/person/21044" order="0" cast_id="1001" /> 
    <person name="Zaphod Beeblebrox" character="" job="Director" id="589088" thumb="" department="Directing" url="http://www.themoviedb.org/person/589088" order="0" cast_id="1000" /> 
</xml> 
+0

благодарит за такой хороший ответ! – Max

0

Я думаю, что это будет работать, не проверял, хотя

foreach ($movies->movies->movie->cast->children() as $person) 
{ 
    $cast->appendChild($person); 
} 
+0

спасибо но .. похоже не работает. до этого я ящик: '$ cast = $ root-> appendChild ( $ xmldoc-> createElement (" cast "));' не знаю, можете ли вы использовать эту информацию, чтобы дать мне руку! – Max

+0

@Max: если вам нужно использовать createElement, вам придется копировать атрибуты вручную. – RageZ

+0

См., Я создаю элемент корня , где я добавляю каждый . В каждом мне нужно добавить с коллекцией . поэтому я создаю этот элемент «cast» .. что я могу сделать, чтобы скопировать в этом «родительский» все из $ фильмов, включая атрибуты ??? – Max

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