在php中将大型XML文件拆分为更小的部分

时间:2015-01-19 16:07:16

标签: php xml

我如何将大型xml文件拆分成更小的文件,我希望每个节点都有一个xml文件,并且子文件节点会给出xml文件的名称。

XML文件具有以下结构

<Products>
  <Products>
    <ID>ID</ID>
    <Name>Product_Name</Name>
    <Qty>qty</Qty>
    <Brand>Brand</Brand>
     ......
  </Product>
  <Product>
    <ID>ID</ID>
    <Name>Product_Name</Name>
    <Qty>qty</Qty>
    <Brand>Brand</Brand>
     ......
  </Product>
  <Product>
   ........
  </Product>
</Products>

我在互联网上搜索过,我只发现了c#解决方案,我不知道c#

所以我需要为每个产品都有一个XML文件,xml文件的名称由<ID></ID>

的值给出

2 个答案:

答案 0 :(得分:0)

你应该对DomDocument和XPath做点什么 试用: //产品[./ ID / text()=“ID2”] 或只是 //产品

答案 1 :(得分:0)

您可以使用XSL(T)(或者可以不使用,具体取决于服务器配置) 当前版本的libxslt仍然是xsl 1.0,并且不支持xsl:result-document
但它支持exsl:document扩展,它的用途几乎相同。

<?php
$xsl = new XSLTProcessor;
$xsl->setSecurityPrefs(
    $xsl->getSecurityPrefs() ^ XSL_SECPREF_WRITE_FILE
);


$xsl->importStylesheet( doc(style()) );
$doc = doc( data() );

$xsl->transformToXML($doc);

function doc($xml) {
    $doc = new DOMDocument;
    $doc->loadxml($xml);
    return $doc;
}

function style() {
    return <<< eox
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:exsl="http://exslt.org/common"
                extension-element-prefixes="exsl">
  <xsl:template match="/">
    <xsl:for-each select="Products/Product">
        <exsl:document href="Product{ID}.xml" method="html">
            <Product>
                <xsl:apply-templates />
            </Product>
        </exsl:document>
        </xsl:for-each>
  </xsl:template>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
eox;
}

function data() {
    return <<< eox
<Products>
    <Product>
        <ID>ID1</ID>
        <Name>Product_Name1</Name>
        <Qty>qty1</Qty>
        <Brand>Brand1</Brand>
    </Product>
    <Product>
        <ID>ID2</ID>
        <Name>Product_Name2</Name>
        <Qty>qty2</Qty>
        <Brand>Brand2</Brand>
    </Product>
    <Product>
        <ID>ID3</ID>
        <Name>Product_Name3</Name>
        <Qty>qty3</Qty>
        <Brand>Brand3</Brand>
    </Product>
    <Product>
        <ID>ID4</ID>
        <Name>Product_Name4</Name>
        <Qty>qty4</Qty>
        <Brand>Brand4</Brand>
    </Product>
</Products>
eox;
}

在我的机器上创建四个文件(ProductID1.xml ... ProductID4.xml),每个文件包含一个Product元素的数据。
XsltProcessor::setSecurityPrefs相对较新。您的脚本应检查xsl实例是否具有此类方法,如果不是,请使用ini_set('xsl.security_prefs'...)禁用&#34;写保护&#34;。否则你可能得到一堆

而不是输出
Warning: XSLTProcessor::transformToXml(): File write for ProductID1.xml refused in ...test.php on line ...

警告/错误。
也许代替<Product><xsl:apply-templates />构造<xsl:copy-of select="."/>更适合。