将多个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,好的开始!您可以查看simplexml
或DOM
并尝试一些代码。如果您需要帮助,请编辑您的问题,展示您的尝试并具体指出您需要什么。
@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合并为一个的主要内容,如果未能解决你的问题,请参考以下文章