将多个XML合并为一个

4

你好,我正在将一个XML数据流解析为数组,并且目前它已经可以正常工作。但是现在我遇到了一个问题,因为我需要将多个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", 'SimpleXMLElement', LIBXML_NOCDATA);

    simplexml_merge($xml1, $xml2);
    $xml1->asXml('output.xml');

请告诉我如何最好地实现这个目标。
非常感谢您的帮助。


嗨Dh,做得不错!你可以研究一下simplexml或者DOM,然后试着写一些代码。如果需要帮助,编辑你的问题,展示你已经尝试过的内容,并且明确指出你需要什么帮助。 - michi
@michi,我已经更新了我的问题,并附上了我到目前为止尝试过的代码,请看一下。 - Dhaval Bharadva
1个回答

3
只需要使用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();

你好,我该如何将XML添加到数组中呢?因为我有一个提要URL,并从该URL加载XML数据。 - Dhaval Bharadva
我得到了我之前评论的解决方案。 - Dhaval Bharadva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接