combine multiple xml into one
arrays, parsing, php, xml, xml-parsing
Solution
Just use DOM, not SimpleXML. I added the XML to an array, here. In real code that might be a list of filenames and DOMDocument::load() would be used, not DOMdocument::loadXml().
$addXml = array();
$addXml[] = '<JobRecords>
<JobRecord>
<Brand>Corporate1</Brand>
<WorkTypes>
<WorkTypeRecord>
<Title>Permanent1</Title>
</WorkTypeRecord>
</WorkTypes>
</JobRecord>
</JobRecords>';
$addXml[] = '<JobRecords>
<JobRecord>
<Brand>Corporate2</Brand>
<WorkTypes>
<WorkTypeRecord>
<Title>Permanent2</Title>
</WorkTypeRecord>
</WorkTypes>
</JobRecord>
</JobRecords>';
// create a new document
$dom = new DOMDocument();
// and add the root element
$dom->appendChild($dom->createElement('JobRecords'));
// for each document/xml to add
foreach ($addXml as $xml) {
// create a dom
$addDom = new DOMDocument();
// load the xml
$addDom->loadXml($xml);
// if here is a root node in the loaded xml
if ($addDom->documentElement) {
// for each child of the loaded root node
foreach ($addDom->documentElement->childNodes as $node) {
// append to the result dom
$dom->documentElement->appendChild(
// after importing the child to the result dom
$dom->importNode($node, TRUE)
);
}
}
}
echo $dom->saveXml();
About the same using a list of filenames/urls:
$files= array(
'xml1.xml',
'xml2.xml'
);
$dom = new DOMDocument();
$dom->appendChild($dom->createElement('JobRecords'));
foreach ($files as $filename) {
$addDom = new DOMDocument();
$addDom->load($filename);
if ($addDom->documentElement) {
foreach ($addDom->documentElement->childNodes as $node) {
$dom->documentElement->appendChild(
$dom->importNode($node, TRUE)
);
}
}
}
echo $dom->saveXml();
Problem
Hi i am parsing one xml feed into an array and its working fine for me but till now i have only one xml feed but now i am bit of stuck at one point because i need to combine multiple xml into one and then parse whole xml into an array. here i am providing some example code what actual i want. XML1 ``` <JobRecords> <JobRecord> <Brand>Corporate1</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent1</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> </JobRecords> ``` XML2 ``` <JobRecords> <JobRecord> <Brand>Corporate2</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent2</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> </JobRecords> ``` XML3 ``` <JobRecords> <JobRecord> <Brand>Corporate3</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent3</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> </JobRecords> ``` Combine XML that i want as output ``` <JobRecords> <JobRecord> <Brand>Corporate1</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent1</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> <JobRecord> <Brand>Corporate2</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent2</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> <JobRecord> <Brand>Corporate3</Brand> <WorkTypes> <WorkTypeRecord> <Title>Permanent3</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> </JobRecords> ``` So far i have tried below code and it's work for me but take too much time for generate combine output.xml. so is there any other way to achieve this with better solution. ``` function simplexml_merge(SimpleXMLElement &$xml1, SimpleXMLElement $xml2) { // convert SimpleXML objects into DOM ones $dom1 = new DomDocument('1.0', 'UTF-8'); $dom2 = new DomDocument('1.0', 'UTF-8'); $dom1->loadXML($xml1->asXML()); $dom2->loadXML($xml2->asXML()); // pull all child elements of second XML $xpath = new domXPath($dom2); $xpathQuery = $xpath->query('/*/*'); for ($i = 0; $i < $xpathQuery->length; $i++) { // and pump them into first one $dom1->documentElement->appendChild( $dom1->importNode($xpathQuery->item($i), true)); } $xml1 = simplexml_import_dom($dom1); } $xml1 = simplexml_load_file("xml1.xml", 'SimpleXMLElement', LIBXML_NOCDATA); $xml2 = simplexml_load_file("xml2.xml", 'SimpleXMLElement', LIBXML_NOCDATA); simplexml_merge($xml1, $xml2); $xml1->asXml('output.xml'); ``` Please advise me what is the best way to achieve this. Thanks in advance and much appreciated.