我如何将大型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>
答案 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="."/>
更适合。