2015-01-19 2 views
0

Как можно разбить большой XML-файл на более мелкие, я хочу, чтобы один xml-файл для каждого узла и имя файла xml задавался дочерним узлом fron.Разделить большие XML-файлы на более мелкие фрагменты в php

XML файл имеет ниже структуру

Я искал через Интернет, и я нашел только в C# решений и я не знаю, с #

Так что мне нужно иметь один XML-файл для каждого продукта и имя файла XML задается значением от <ID></ID>

+0

Вы считаете приемлемым ответ на основе Java? –

ответ

0

Вы должны сделать что-то с DomDocument и XPath Попробуйте с: //Product[./ID/t ext() = "ID2"] или только // Продукт

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), каждая из которых содержит данные одного элемента продукта.
XsltProcessor::setSecurityPrefs относительно новый. Ваш скрипт должен проверить, имеет ли экземпляр xsl такой метод, и вместо этого вместо него следует использовать ini_set('xsl.security_prefs'...), чтобы отключить «защиту записи». В противном случае вместо вывода вы можете получить пучок

Warning: XSLTProcessor::transformToXml(): File write for ProductID1.xml refused in ...test.php on line ... 

предупреждение/ошибки.
И, возможно, вместо <Product><xsl:apply-templates /> конструкция <xsl:copy-of select="."/> подходит больше.

Смежные вопросы