Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将小XML文件添加到大XML文件中的特定位置_Php_Xml - Fatal编程技术网

Php 将小XML文件添加到大XML文件中的特定位置

Php 将小XML文件添加到大XML文件中的特定位置,php,xml,Php,Xml,我有一个像这样的大XML文件 <?xml version="1.0" encoding="utf-8"?> <catpharma date_generation="28-02-2019" version_xsd="6"> <cat> <node1>xxx</node1> <node2>xxx</node2> <node3>xxx</node

我有一个像这样的大XML文件

<?xml version="1.0" encoding="utf-8"?>
<catpharma date_generation="28-02-2019" version_xsd="6">
    <cat>
        <node1>xxx</node1>
        <node2>xxx</node2>
        <node3>xxx</node3>
        <date/>
        <!-- data from the small xml files need to be appended here --> 

        <node4>
        ...
通过循环,我将知道需要附加哪个正确的小XML文件,也就是说,每次循环被迭代时,一个小XML文件被附加到大XML文件

最终结果如下所示

<?xml version="1.0" encoding="utf-8"?>
    <catpharma date_generation="28-02-2019" version_xsd="6">
        <cat>
            <node1>xxx</node1>
            <node2>xxx</node2>
            <node3>xxx</node3>
            <date/>
            <gamme>
                <id>1234</id>
                <nom>xxx</nom>
                <position>29</position>
                <gamme>
                    <id>4567</id>
                    <nom>zzz</nom>
                    <position>2705</position>
                </gamme>
            </gamme>
            <!-- more `gamme` nodes from other small XML files to be added here-->
            <node4>
            ...
到目前为止,我看到的所有解决方案都建议您在大XML文件中创建一个节点,然后继续逐个添加子节点的详细信息,例如下面的示例

但问题是,既然小xml文件中已经有了gamme节点,我就不能把文件作为一个整体读取并添加到那里吗?而不必逐个读取小xml文件中的行


到目前为止,我还没有看到任何解决方案来实现它。

您不需要在目标文档中创建节点。任何有效的XML文档都有一个文档元素节点。因此,您必须加载主文档,找到特定节点。迭代细节文档并导入和附加其文档元素

对于下面的示例,我将XML简化为字符串文本。要使用文件,只需更改加载方法

$mainXML = <<<'XML'
<catpharma>
    <cat>
        <node1/>
        <date/>
        <node4/>
    </cat>    
    <date/>
</catpharma>
XML;

$detailXMLs = [
  '<gamme><id>1234</id></gamme>',
  '<gamme><id>5678</id></gamme>',
];

// create document and load the main XML
$main = new DOMDocument();
$main->preserveWhiteSpace = FALSE;
$main->loadXML($mainXML);
$xpath = new DOMXpath($main);

// iterate the first "date" element in the document
foreach ($xpath->evaluate('(//date)[1]') as $dateNode) {
    // iterate the detail XML strings
    foreach ($detailXMLs as $detailXML) {
        // load into a document
        $detail = new DOMDocument();
        $detail->loadXML($detailXML);

        // append into the parent of the "date" node
        $dateNode->parentNode->insertBefore(
            // import the document elment into the main document
            $main->importNode($detail->documentElement, TRUE),
            // insert before the node following the "date" node
            $dateNode->nextSibling
        );
    }
}

$main->formatOutput = TRUE;
echo $main->saveXML();
输出:

<?xml version="1.0" encoding="UTF-8"?>
<catpharma>
  <cat>
    <node1 />
    <date />
    <gamme>
      <id>5678</id>
    </gamme>
    <gamme>
      <id>1234</id>
    </gamme>
    <node4 />
  </cat>
  <date />
</catpharma>
考虑使用,这是一种特殊用途的语言,旨在重新构造XML文件,甚至可以将文件导入其文档方法。PHP可以使用其库运行XSLT1.0脚本。另外,XSLT是可移植的,可以在PHP之外运行。下面假设小XML文件与大XML文件位于同一目录中:

XSLT另存为.xsl文件


如果您有许多小XML文件,让PHP运行一个循环来构建XSLT,它实际上是一个特殊的XML文件。然后,让PHP调用最后的脚本。< /P>不允许在另一个内部考虑使用PrRoad。它作为xml是有效的,但并不正确。我认为您应该将所有文件放在同一级别的内部,并对嵌套的文件使用父id。@AndreilupuleSA问题是,我必须绝对按照小文件的方式处理它们;也就是说,我的工作就是将小文件中的数据按原样放入大文件中。不幸的是,我无法修改小文件中的任何内容。另一个将接收最终xml文件的系统不知道任何信息,因此在解析时会遇到错误。
<?xml version="1.0" encoding="UTF-8"?>
<catpharma>
  <cat>
    <node1 />
    <date />
    <gamme>
      <id>5678</id>
    </gamme>
    <gamme>
      <id>1234</id>
    </gamme>
    <node4 />
  </cat>
  <date />
</catpharma>
<?xml version="1.0" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
   <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
   <xsl:strip-space elements="*"/>

   <!-- Identity Transform -->
   <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template> 

   <!-- Rewrite cat node -->
   <xsl:template match="cat">
      <xsl:copy> 
        <xsl:apply-templates select="node1|node2|node3|date"/>
        <xsl:copy-of select="document('small_file1.xml')/gamme"/>
        <xsl:copy-of select="document('small_file2.xml')/gamme"/>
        <xsl:copy-of select="document('small_file3.xml')/gamme"/>
        ...
        <xsl:apply-templates select="*[position() &gt; 4]"/>             
      </xsl:copy>
   </xsl:template> 

</xsl:transform>
// Load the XML source and XSLT file
$doc = new DOMDocument();
$doc->load('Input.xml');

$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc);

// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);