За последние 24 часа нас посетили 17136 программистов и 1629 роботов. Сейчас ищут 1463 программиста ...

Как разрезать XML файл при помощи PHP и, возможно, XSL

Тема в разделе "Прочие вопросы по PHP", создана пользователем MaEcTPo, 30 сен 2008.

  1. MaEcTPo

    MaEcTPo Активный пользователь

    С нами с:
    4 июл 2008
    Сообщения:
    11
    Симпатии:
    0
    Здравствуйте,
    значит задача стоит вот в чем.
    Есть файл приблизительно такой структуры:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <ICG version="2005042510">
    <Category name="electronics">
    <ItemType>
    <Category name="audio-video-accessories-and-parts">
    <Term name="audio-video-accessories-and-parts">
    <Term name="audio-crossovers-and-accessories"></Term>
    </Term>
    </Category>
    </ItemType>
    </Category>
    <Category name="house_and_garden">
    <ItemType>
    .....
    <ItemType>
    </Category>
    </ICG>

    Оговорюсь, что структура файла, после открытия категории (электроникс) заранее не известна, но она древовидная.
    Задача стоит вот в чем.
    Нужно сделать из одного XML файла несколько XML файлов, которые будут называться electronics.xml house_and_garden.xml и будут содержать в корне вот это <Category name="electronics"> , а все остальное - только то что к ним относится.

    Курю мануалы уже 3-й день.
    Не знаю как разбить, и все тут...
     
  2. ibnteo

    ibnteo Активный пользователь

    С нами с:
    30 сен 2008
    Сообщения:
    34
    Симпатии:
    1
    Если попроще, то можно так:
    Код (Text):
    1.  
    2. $doc=new DomDocument();
    3. $doc->load('ICG.xml');
    4. for($i=0; $i<$doc->documentElement->childNodes; $i++) {
    5.     $node=$doc->documentElement->childNodes->item($i);
    6.     $doc_save = new Document();
    7.     $node_save=$doc_save->importNode($node, true);
    8.     $doc_save->appendChild($node_save);
    9.     $doc_save->save($node->getAttribute('name') . '.xml');
    10. }
    Если в /ICG есть не только узлы Category, или надо сохранять и вложенные, то нужно использовать DomXpath:
    Код (Text):
    1.  
    2. $doc=new DomDocument();
    3. $doc->load('ICG.xml');
    4. $xpath = new DomXpath($doc);
    5. $query = $xpath->query('//Category');
    6. for($i=0; $i<$query.length; $i++) {
    7.     $node=$query->item($i);
    8.     $doc_save = new Document();
    9.     $node_save=$doc_save->importNode($node, true);
    10.     $doc_save->appendChild($node_save);
    11.     $doc_save->save($node->getAttribute('name') . '.xml');
    12. }
     
  3. MaEcTPo

    MaEcTPo Активный пользователь

    С нами с:
    4 июл 2008
    Сообщения:
    11
    Симпатии:
    0
    ibnteo, спасибо, вы очень помогли.
    Получилось вторым способом, через XPath. Вот кусок работающего кода:
    PHP:
    1. $doc=new DOMDocument();
    2. $doc->load('electronics.xml');
    3. $xpath = new DomXpath($doc);
    4. $query = $xpath->query('/ICG/Category');
    5. /*debug*/ echo "<hr> /cs_amazon/cs_office-5.11/channels/amazon/tests/test_xml.php <hr><pre>";
    6. /*debug*/ print_r ($query->length); echo "</pre>";
    7. for($i=0; $i < $query->length; $i++) {
    8.     $node=$query->item($i);
    9.     $doc_save = new DOMDocument();
    10.     $node_save=$doc_save->importNode($node, true);
    11.     $doc_save->appendChild($node_save);
    12.     $doc_save->save($node->getAttribute('name') . '_083.xml');
    13. }