如何附加多个XML文件

时间:2018-03-31 06:30:17

标签: php xml

我有一个大型的XML文件,需要永远加载到外部FTP编辑器上,所以我想把它分成几个文件。

我使用simplexml_load_file但无法将多个文件加载到同一个数组中。

XML文件具有相同的结构,以下是每个文件的示例:

A.XML:

<?xml version="1.0"?> 
<queries>
    <query>
      <admin_user_type>user</admin_user_type>
      <show_in_menu>True</show_in_menu>
      <title>Dashboard</title>
      <vertical_report>True</vertical_report>
  </query>
</queries>

B.XML:

<?xml version="1.0"?>
<queries>
    <query>
        <admin_user_type>admin</admin_user_type>
        <show_in_menu>false</show_in_menu>
        <title>Profile Element</title>
        <input_name>Id</input_name>
        <input_type>hidden</input_type>
    </query>
</queries>

两个文件之间的7,000行中有大约200个查询。

代码在下面的foreach中失败:

$xml = read_xml_files();
foreach($xml->children() as $xml) {
    ...
    ...
}

以下是我从奈杰尔的建议中得出的结论:

function read_xml_files() {
    $target = new DOMDocument();
    $target->loadXML('<base />');
    mergeFile($target, XML_FILES_FOLDER."a.xml");
    mergeFile($target, XML_FILES_FOLDER."b.xml");
    $xml = simplexml_import_dom($target);
    return $xml->asXML();
}

function mergeFile ( DOMDocument $target, $fileName )    {
$source = new DOMDocument();
$source->load($fileName);

foreach ( $source->childNodes as $row )   {
    $import = $target->importNode($row, true);
    $target->documentElement->appendChild($import);
    }
}

感谢您的任何建议!

1 个答案:

答案 0 :(得分:1)

如果您使用DOMDocument来执行主合并部分...

function mergeFile ( DOMDocument $target, $fileName )    {
    $source = new DOMDocument();
    $source->load($fileName);

    foreach ( $source->childNodes as $row )   {
        $import = $target->importNode($row, true);
        $target->documentElement->appendChild($import);
    }
}
$target = new DOMDocument();
$target->loadXML('<base />');
mergeFile($target, "file1.xml");
mergeFile($target, "file2.xml");

$xml = simplexml_import_dom($target);
echo $xml->asXML();

最后$ xml包含合并的文件。

请注意,这会为文档添加另一个级别(除非我知道内容的类型,否则很难做其他事情)。所以在这种情况下你会得到类似......

的东西

file1.xml

<?xml version="1.0" encoding="UTF-8"?>
<A>A</A>

file2.xml

<?xml version="1.0" encoding="UTF-8"?>
<B>B</B>

结果将是

<?xml version="1.0"?>
<base>
<A>A</A>
<B>B</B>
</base>

<强>更新

你也可以试试......

function read_xml_files() {
    $target = new DOMDocument();
    $target->loadXML('<queries />');
    mergeFile($target, "NewFile.xml");
    mergeFile($target, "NewFile1.xml");
    $xml = simplexml_import_dom($target);
    return $xml->asXML();
}

function mergeFile ( DOMDocument $target, $fileName )    {
    $source = new DOMDocument();
    $source->load($fileName);

    foreach ( $source->getElementsByTagName("query") as $row )   {
        $import = $target->importNode($row, true);
        $target->documentElement->appendChild($import);
    }
}

这会合并文件,以便结果为

<?xml version="1.0"?>
<queries>
    <query>
        <admin_user_type>user</admin_user_type>
        <show_in_menu>True</show_in_menu>
        <title>Dashboard</title>
        <vertical_report>True</vertical_report>
    </query>
    <query>
        <admin_user_type>admin</admin_user_type>
        <show_in_menu>false</show_in_menu>
        <title>Profile Element</title>
        <input_name>Id</input_name>
        <input_type>hidden</input_type>
    </query>
</queries>