2015-11-17 4 views
0

Я должен клонировать узел XML и его дочерние элементы и добавлять его к новому XML в теге спецификаций.Узел XML Clone в PHP

Ie:

Источник XML:

<root> 
    <element> 
    <back> 
    <item1>ABC</item1> 
    <item2>DEF</item2> 
    <more> 
     <moreitem>GHI</moreitem> 
    </more 
    </back> 
    </element> 
</root> 

Назначение XML:

<root> 
    <base1> 
    <item1>FOO</item1> 
    <item2>BAR</item2> 
    <base2> 
    **<back>From source XML and all its childs here</back>** 
    </base2> 
    </base1> 
<root> 
+0

Я думаю, что решение находится в DOMXPath, но я cound't понимаю. –

+0

Возможный дубликат http://stackoverflow.com/questions/2356144/php-duplicate-xml-node-using-simple-xml – Jan

+0

Я уже видел это. Похоже, что способ импорта узла - это то, что мне нужно, но он не добавляет импортированный узел к определенному тегу существующего XML, если я хорошо понял. –

ответ

0

DOMXpath::evaluate() позволяет получать узлы, используя Xpath выражения. DOMDocument::importNode() дублирует узел и импортирует узел в целевой документ. DOMNode::cloneNode() создайте дубликат узла для добавления в тот же документ. DOMNode::appendChild() позволяет добавлять импортированный/клонированный узел.

$source = <<<'XML' 
<root> 
    <element> 
    <back> 
    <item1>ABC</item1> 
    <item2>DEF</item2> 
    <more> 
     <moreitem>GHI</moreitem> 
    </more> 
    </back> 
    </element> 
</root> 
XML; 

$target = <<<'XML' 
<root> 
    <base1> 
    <item1>FOO</item1> 
    <item2>BAR</item2> 
    <base2> 
    </base2> 
    </base1> 
</root> 
XML; 

$sourceDocument = new DOMDocument(); 
$sourceDocument->loadXml($source); 
$sourceXpath = new DOMXpath($sourceDocument); 

$targetDocument = new DOMDocument(); 
$targetDocument->loadXml($target); 
$targetXpath = new DOMXpath($targetDocument); 

foreach ($targetXpath->evaluate('/root/base1/base2[1]') as $targetNode) { 
    foreach ($sourceXpath->evaluate('/root/element/back') as $backNode) { 
    $targetNode->appendChild($targetDocument->importNode($backNode, TRUE)); 
    } 
} 

echo $targetDocument->saveXml(); 

Выход:

<?xml version="1.0"?> 
<root> 
    <base1> 
    <item1>FOO</item1> 
    <item2>BAR</item2> 
    <base2> 
     <back> 
     <item1>ABC</item1> 
     <item2>DEF</item2> 
     <more> 
      <moreitem>GHI</moreitem> 
     </more> 
     </back> 
    </base2> 
    </base1> 
</root> 
+0

Отлично, спасибо большое! –

+0

И где-то программист XSLT немного плачет! – Parfait

+0

Я использую XSLT много. :-) – ThW

0

Это простой способ сделать это:

$src = new DOMDocument(); 
$dst = new DOMDocument(); 

$src->loadXML($src_xml); 
$dst->loadXML($dst_xml); 

$back = $src->getElementsByTagName('back')->item(0); 
$base = $dst->getElementsByTagName('base2')->item(0); 

$base->appendChild($dst->importNode($back, true)); 
echo $dst->saveXML(); 
1

Конечно, вы можете использовать XSLT, родной язык программирования реструктурировать XML документы в любом нюансов необходимо. В частности, здесь требуется вытягивание XML-контента из внешнего XML-файла источника. И PHP, как и другие языки общего назначения (Java, C#, Python, VB), поддерживает библиотеки для обработки XSLT.

XSLT(сохранить как .xsl или .xslt файл, который будет использоваться в PHP ниже, и убедитесь, что источник и назначения XML-файлы находятся в том же каталоге)

<?xml version="1.0" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*" /> 

    <!-- Identity Transform --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="back"> 
    <back> 
    <xsl:copy-of select="document('Source.xml')"/> 
    </back> 
    </xsl:template> 

</xsl:transform> 

PHP(загрузка XML и XSL файлы внешне, но могут быть встроены в виде строки)

$destinationdoc = new DOMDocument(); 
$doc1->load('Destination.xml'); 

$xsl = new DOMDocument; 
$xsl->load('XSLTScript.xsl'); 

// Configure the transformer 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 

// Transform XML source 
$newXml = $proc->transformToXML($doc1); 

// Save output to file 
$xmlfile = 'FinalOutput.xml'; 
file_put_contents($xmlfile, $newXml); 

OUTPUT(используя выше размещенные Source и Destination XML)

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <base1> 
    <item1>FOO</item1> 
    <item2>BAR</item2> 
    <base2> 
     <back> 
     <root> 
      <element> 
      <back> 
       <item1>ABC</item1> 
       <item2>DEF</item2> 
       <more> 
       <moreitem>GHI</moreitem> 
       </more> 
      </back> 
      </element> 
     </root> 
     </back> 
    </base2> 
    </base1> 
</root> 
Смежные вопросы