将目录中的多个xml文件合并到一个文件中

时间:2018-03-09 01:25:27

标签: php xml xslt

我在一个名为“jobs”的网站目录文件夹中有多个xml文件,我一直在尝试将该jobs文件夹中的任何xml文件合并到一个名为Output.xml的xml文件中

PHP代码我部分工作但是我的问题是它没有将该jobs目录中的所有xml文件组合到output.xml中,除非我指定了文件名。现在我有点卡住,因为我不知道为什么它只在output.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>  

XSLT(将.xsl文件保存在与所有XML文件相同的目录中)

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
        <xsl:strip-space elements="*"/>

        <xsl:template match="/">
            <files>
                <xsl:copy-of select="/jobs"/>               
                <!-- add more as needed -->
            </files>
        </xsl:template>

</xsl:stylesheet>

PHP(加载第一个XML和XSL脚本,然后转换/输出)

// LOAD XML SOURCE
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('xml1.xml');                  

// LOAD XSL SOURCE
$xsl = new DOMDocument('1.0', 'UTF-8');
$xsl->load('XSLT_Script.xsl');

// TRANSFORM XML
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
$newXML = $proc->transformToXML($xml);

// SAVE NEW XML
file_put_contents('output.xml', $newXML);

2 个答案:

答案 0 :(得分:0)

我确信有一种更干净的方法,但你可以使用数组scandir http://php.net/manual/en/function.scandir.php来获取目录中的所有文件名(如果除了xml文件之外还有其他文件,你可以将它们过滤掉)然后迭代通过他们的功能。

答案 1 :(得分:0)

您可以直接从php应用程序运行此unix命令以生成文件:

(head -1 xml1; xmllint -xpath '//JobRecord' xml2 xml1; tail -1 xml1) | xmllint --format - > newXML.xml

演示:

more xml1 xml2
::::::::::::::
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>

$ (head -1 xml1; xmllint -xpath '//JobRecord' xml2 xml1; tail -1 xml1) | xmllint --format -
<?xml version="1.0"?>
<JobRecords>
  <JobRecord>
    <Brand>Corporate2</Brand>
    <WorkTypes>
      <WorkTypeRecord>
        <Title>Permanent2</Title>
      </WorkTypeRecord>
    </WorkTypes>
  </JobRecord>
  <JobRecord>
    <Brand>Corporate1</Brand>
    <WorkTypes>
      <WorkTypeRecord>
        <Title>Permanent1</Title>
      </WorkTypeRecord>
    </WorkTypes>
  </JobRecord>
</JobRecords>

使用正确的xpath直接使用某些xml解析器并重构输出XML页眉/页脚会更容易。

要从php应用程序运行shell命令,请检查以下链接:PHP shell_exec() vs exec()