【问题标题】:combine multiple xml file in a directory into one file将一个目录中的多个xml文件合并为一个文件
【发布时间】:2018-03-09 01:25:26
【问题描述】:

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

我的 PHP 代码部分有效,但我的问题是它不会将该作业目录中的所有 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(与所有 XML 文件在同一目录中保存为 .xsl 文件)

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

【问题讨论】:

  • 我的回答对您有帮助吗? ;-)
  • 给新手的建议:如果一个答案解决了您的问题,请点击旁边的大复选标记 (✓) 接受它,也可以选择投票(投票至少需要 15 个声望)点)。如果您发现其他答案有帮助,请给他们投票。接受和投票有助于未来的读者。请看【相关帮助中心文章】[1] [1]:stackoverflow.com/help/someone-answers
  • 我的回答解决了你的问题吗?

标签: php xml xslt


【解决方案1】:

我确定有一种更简洁的方法,但您可以使用数组 scandir http://php.net/manual/en/function.scandir.php 来获取目录中的所有文件名(如果有除 xml 文件以外的任何文件,您可以将它们过滤掉)然后遍历它们在你的函数中。

【讨论】:

    【解决方案2】:

    您可以直接从您的 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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-28
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多