Привет, я разбираю несколько XML-каналов и объединяюсь в один, и он отлично работает для меня, но теперь я немного застрял в одной точке, потому что мне нужно добавить префикс в определенное значение узла, то есть мне нужно изменить значение этого узла. здесь я предоставляю некоторый пример кода, что реально хочу.
XML
<JobRecords> <JobRecord> <Brand>Corporate1</Brand> <JobId>45982</JobId> <WorkTypes> <WorkTypeRecord> <Title>Permanent1</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> <JobRecord> <Brand>Corporate2</Brand> <JobId>45983</JobId> <WorkTypes> <WorkTypeRecord> <Title>Permanent2</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> <JobRecord> <Brand>Corporate3</Brand> <JobId>45984</JobId> <WorkTypes> <WorkTypeRecord> <Title>Permanent3</Title> </WorkTypeRecord> </WorkTypes> </JobRecord> </JobRecords>
В приведенном выше xml я хочу добавить префикс следующим образом <JobId>0-45984</JobId>
Вот код php, который объединяет различные XML-каналы в один выдавать, как указано выше.
<?php $feed1 = "data1.xml"; $feed2 = "data2.xml"; $feed3 = "data3.xml"; $xml1 = new DOMDocument('1.0', 'UTF-8'); $xml1->load($feed1); $xml2 = new DOMDocument('1.0', 'UTF-8'); $xml2->load($feed2); $xml3 = new DOMDocument('1.0', 'UTF-8'); $xml3->load($feed3); $addXml = array(); $addXml[] = $xml1->saveXML(); $addXml[] = $xml2->saveXML(); $addXml[] = $xml3->saveXML(); // create a new document $dom = new DOMDocument(); $dom->appendChild($dom->createElement('JobRecords')); foreach ($addXml as $xml) { $addDom = new DOMDocument(); $addDom->loadXml($xml); if ($addDom->documentElement) { foreach ($addDom->documentElement->childNodes as $node) { $dom->documentElement->appendChild( $dom->importNode($node, TRUE) ); } } } $xmlFinal = $dom->saveXml(); echo $xmlFinal; ?>
Я пробовал до сих пор, но не удалось. Пожалуйста, сообщите мне, как это сделать.
Спасибо заранее и высоко оценил.
Вы можете выполнить итерацию с корня и проверить и заменить узел следующим образом. Здесь $xmlData
содержит строку вашего xml.
$dom = new DOMDocument(); $dom->loadXML($xmlData); foreach ($dom->documentElement->childNodes as $node) { //print_r($node); if($node->nodeType==1){ $OldJobId = $node->getElementsByTagName('JobId')->Item(0); $newelement = $dom->createElement('JobId','0-'.$OldJobId->nodeValue); $OldJobId->parentNode->replaceChild($newelement, $OldJobId); } } $str = $dom->saveXML($dom->documentElement); echo $str;
Здесь вы можете найти рабочую демонстрацию
Я не уверен, почему вы не загружаете XML-канал непосредственно внутри цикла, как во втором примере предыдущего ответа .
После импорта элемента «JobRecord» в целевой документ необходимо найти его JobId child и изменить его свойство nodeValue
$files= array( 'xml1.xml', 'xml2.xml', 'xml3.xml' // ... more xmls ); $dom = new DOMDocument(); $dom->appendChild($dom->createElement('JobRecords')); // get an xpath object $xpath = new DOMXpath($dom); // $index variable for later use foreach ($files as $index => $filename) { $addDom = new DOMDocument(); $addDom->load($filename); if ($addDom->documentElement) { foreach ($addDom->documentElement->childNodes as $node) { $dom->documentElement->appendChild( $record = $dom->importNode($node, TRUE) ); // find the jobId child elements (should be only one) $jobIds = $xpath->evaluate('./JobId', $record); foreach ($jobIds as $jobId) { // prefix the value with the index $jobId->nodeValue = $index.'-'.$jobId->nodeValue; } } } } echo $dom->saveXml();