मुझे एक XML नोड और उसके childs को क्लोन करना है और इसे एक विशेष XML में एक विशेष टैग में जोड़ना है।

अर्थात:

स्रोत 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>
1
Pablo Lionel Arturi 17 नवम्बर 2015, 23:13

3 जवाब

सबसे बढ़िया उत्तर

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>
1
ThW 17 नवम्बर 2015, 20:35

बेशक आप किसी भी बारीक जरूरतों के लिए XML दस्तावेज़ों को पुन: व्यवस्थित करने के लिए देशी प्रोग्रामिंग भाषा XSLT का उपयोग कर सकते हैं। विशेष रूप से यहां, आपको एक्सएमएल सामग्री को बाहरी स्रोत एक्सएमएल फ़ाइल से खींचने की आवश्यकता है। और PHP अन्य सामान्य प्रयोजन भाषाओं (जावा, सी #, पायथन, वीबी) की तरह 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 (अपने पोस्ट किए गए स्रोत और गंतव्य 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>
2
Parfait 18 नवम्बर 2015, 04:18

ऐसा करने का यह एक आसान तरीका है:

$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();
0
Hasse Björk 17 नवम्बर 2015, 20:38