加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读