将多个xml合并为一个

Posted

技术标签:

【中文标题】将多个xml合并为一个【英文标题】:combine multiple xml into one 【发布时间】:2013-12-20 18:05:09 【问题描述】:

嗨,我正在将一个 xml 提要解析为一个数组,它对我来说工作正常,但到目前为止我只有一个 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,好的开始!您可以查看simplexmlDOM 并尝试一些代码。如果您需要帮助,请编辑您的问题,展示您的尝试并具体指出您需要什么。 @michi 我已经用我迄今为止尝试过的代码更新了我的问题,请仔细研究一下。 【参考方案1】:

只使用 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 数据。 我得到了我之前评论的解决方案。

以上是关于将多个xml合并为一个的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 导入 SQL 并将多个节点合并为 1 列

XElement - 将多个元素合并到一个下

将列表转换为字典,然后通过键值将多个字典合并为一个字典

Java+XSL合并多个XML文件

如何将多个jar包合并为一

如何将多个jar包合并为一