php – 将多个xml合并为一个
发布时间:2020-12-13 16:51:51 所属栏目:PHP教程 来源:网络整理
导读:嗨,我正在解析一个xml feed到一个数组,它的工作正常,但直到现在我只有一个xml feed但现在我有点卡在一点因为我需要将多个xml组合成一个然后解析整个xml到数组.在这里我提供一些示例代码我想要的实际内容. XML1 JobRecords JobRecord BrandCorporate1/Brand W
嗨,我正在解析一个xml feed到一个数组,它的工作正常,但直到现在我只有一个xml feed但现在我有点卡在一点因为我需要将多个xml组合成一个然后解析整个xml到数组.在这里我提供一些示例代码我想要的实际内容.
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> 合并我想要的XML作为输出 <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> 到目前为止,我已经尝试了下面的代码,它对我有用,但需要花费太多时间来生成组合output.xml.有没有其他方法可以通过更好的解决方案实现这一目标. 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",LIBXML_NOCDATA); simplexml_merge($xml1,$xml2); $xml1->asXml('output.xml'); 请告诉我实现这一目标的最佳方法是什么. 解决方法
只使用DOM,而不是SimpleXML.我在这里将XML添加到数组中.在可能是文件名列表的实际代码中,将使用DOMDocument :: load(),而不是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(); 使用文件名/网址列表大致相同: $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(); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |