Объедините много файлов XML - PullRequest
4 голосов
/ 06 мая 2011

Какой язык можно использовать для объединения нескольких файлов XML.Несколько файлов более 10 *.

PHP, Java или что?

Я пытался использовать XSLT, но не знаю, нужен ли мне «процессор», такой как Saxon.

Документы приводили в замешательство, поскольку я не знал, с чего начать.

В общем, мне нужен кто-то, чтобы указать мне правильное направление.

Кто-то, пожалуйста, помогите.Я пытался понять это в течение нескольких дней

<xml version="1.0">
<products>
<price>Price List Here</price>
<model>Model Number Here</model>
</product>

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

Это можно легко сделать в чистом XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pdoc1Url" select="'doc1.xml'"/>
 <xsl:param name="pdoc2Url" select="'doc2.xml'"/>

 <xsl:template match="/">
  <documents>
    <xsl:copy-of select="document($pdoc1Url)"/>
    <xsl:copy-of select="document($pdoc2Url)"/>
  </documents>
 </xsl:template>
</xsl:stylesheet>

Приведенный выше код имеет дело с двумя XML-документами, но может быть расширен для работы с любым известным заранее номеромXML-документы.

Объяснение :

  1. Передача URL-адресов документов XML в качестве глобальных / внешних параметров для преобразования.

  2. Использование стандартной функции XSLT document().

2 голосов
/ 07 мая 2011

Вы можете использовать любой язык, который позволяет вам манипулировать XML напрямую. Я предлагаю найти что-то с DOM, а не SAX. Если вы используете SAX, вы должны сами пройтись по xml - мне кажется, лаваш. DOM позволяет вам работать с XML более ООП.

Что-то, что сразу приходит на ум, будет xml-оберткой вокруг ваших xml-документов.

Так что-то вроде:

<documents>
   <document>
      <!-- Your xml here -->
   </document>
   <document>
      <!-- Your xml here -->
   </document>
   <document>
      <!-- Your xml here -->
   </document>
</documents>

Псевдокод будет: Создать корень документа. Добавьте элемент с именем Documents, используйте его в качестве корневого. Итерируйте каждый из ваших XML-файлов. Для каждого файла создайте новый элемент с именем document. Добавьте этот элемент к родителю. Загрузите XML из файла. Импортируйте этот узел во внешний документ. Добавьте импортированный узел в дочернюю коллекцию элементов документа.

EDIT Как и было обещано, обновленный код был протестирован, и я знаю, что он работает:

<?php

    // Replace the strings below with the actual filenames, add or decrease as fit
    $filenames = array(0 => "test.xml", 1 => "test2.xml", 2 => "test3.xml" );

    $docList = new DOMDocument();

    $root = $docList->createElement('documents');
    $docList->appendChild($root);

    foreach($filenames as $filename) {

        $doc = new DOMDocument();
        $doc->load($filename);

        $xmlString = $doc->saveXML($doc->documentElement);

        $xpath = new DOMXPath($doc);
        $query = "//product";  // this is the name of the ROOT element

        $nodelist = $xpath->evaluate($query, $doc->documentElement);

        if( $nodelist->length > 0 ) {

            $node = $docList->importNode($nodelist->item(0), true);

            $xmldownload = $docList->createElement('document');
            $xmldownload->setAttribute("filename", $filename);
            $xmldownload->appendChild($node);

            $root->appendChild($xmldownload);
        }

    }

    echo $docList->saveXML();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...