Php 将小XML文件添加到大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 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() > 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);