मुझे एक 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>
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>
बेशक आप किसी भी बारीक जरूरतों के लिए 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>
ऐसा करने का यह एक आसान तरीका है:
$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();
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
php
PHP एक व्यापक रूप से उपयोग किया जाता है, उच्च-स्तरीय, गतिशील, वस्तु-उन्मुख, और व्याख्या की गई स्क्रिप्टिंग भाषा मुख्य रूप से सर्वर-साइड वेब विकास के लिए डिज़ाइन की गई है। PHP भाषा के बारे में सवालों के लिए इस्तेमाल किया।