Mam taki plik XML w ten sposób

<?xml version="1.0" encoding="utf-8"?>
<catpharma date_generation="28-02-2019" version_xsd="6">
    <cat>
        <node1>xxx</node1>
        <node2>xxx</node2>
        <node3>xxx</node3>
        <date/>
        <!-- data from the small xml files need to be appended here --> 

        <node4>
        ...

Następnie mam kilka małych plików XML, które muszą być dołączone tuż po węźle date.

Małe pliki XML wyglądają tak:

<gamme>
    <id>1234</id>
    <nom>xxx</nom>
    <position>29</position>
    <gamme>
        <id>4567</id>
        <nom>zzz</nom>
        <position>2705</position>
    </gamme>
</gamme>

Poprzez pętlę, wiem, który prawidłowy plik XML należy dołączyć, czyli za każdym razem, gdy pętla jest zawszewa, plik "mały" plik XML jest dołączony do dużej.

Ostateczny wynik musi być następujący

<?xml version="1.0" encoding="utf-8"?>
    <catpharma date_generation="28-02-2019" version_xsd="6">
        <cat>
            <node1>xxx</node1>
            <node2>xxx</node2>
            <node3>xxx</node3>
            <date/>
            <gamme>
                <id>1234</id>
                <nom>xxx</nom>
                <position>29</position>
                <gamme>
                    <id>4567</id>
                    <nom>zzz</nom>
                    <position>2705</position>
                </gamme>
            </gamme>
            <!-- more `gamme` nodes from other small XML files to be added here-->
            <node4>
            ...

Wszystkie rozwiązania, które widziałem do tej pory, sugerują, że utworzysz węzeł w Big XML Plik, a następnie kontynuuj dodanie szczegółów podjednostek jeden na jeden (na przykład ta Rozwiązanie).

Ale to, ponieważ już będę miał już węzły "Gamme" w małych plikach XML, nie mogę przeczytać pliku jako całości i po prostu go dodać? (Bez konieczności czytania linii w małych plikach XML jeden).

Do tej pory nie widziałem żadnych rozwiązań w sposób, w jaki chcę go wdrożyć.

-1
Jolan 1 marzec 2019, 12:24

2 odpowiedzi

Najlepsza odpowiedź

Nie musisz tworzyć węzła w dokumencie docelowym. Każdy prawidłowy dokument XML ma węzeł elementu pojedynczego dokumentu. Więc będziesz musiał załadować główny dokument, znajdź konkretny węzeł. Iteruj dokumenty szczegółowe i importuj i dołącz element dokumentu.

Dla następujących przykładów umieściłem rozebrany XML i umieściłem go w literałów łańcuchowych. Aby używać plików zmienić metodę ładowania.

$mainXML = <<<'XML'
<catpharma>
    <cat>
        <node1/>
        <date/>
        <node4/>
    </cat>    
    <date/>
</catpharma>
XML;

$detailXMLs = [
  '<gamme><id>1234</id></gamme>',
  '<gamme><id>5678</id></gamme>',
];

// create document and load the main XML
$main = new DOMDocument();
$main->preserveWhiteSpace = FALSE;
$main->loadXML($mainXML);
$xpath = new DOMXpath($main);

// iterate the first "date" element in the document
foreach ($xpath->evaluate('(//date)[1]') as $dateNode) {
    // iterate the detail XML strings
    foreach ($detailXMLs as $detailXML) {
        // load into a document
        $detail = new DOMDocument();
        $detail->loadXML($detailXML);

        // append into the parent of the "date" node
        $dateNode->parentNode->insertBefore(
            // import the document elment into the main document
            $main->importNode($detail->documentElement, TRUE),
            // insert before the node following the "date" node
            $dateNode->nextSibling
        );
    }
}

$main->formatOutput = TRUE;
echo $main->saveXML();

Wynik:

<?xml version="1.0" encoding="UTF-8"?>
<catpharma>
  <cat>
    <node1 />
    <date />
    <gamme>
      <id>5678</id>
    </gamme>
    <gamme>
      <id>1234</id>
    </gamme>
    <node4 />
  </cat>
  <date />
</catpharma>
1
ThW 2 marzec 2019, 00:40

Rozważyć przy użyciu XSLT, język specjalnego przeznaczenia zaprojektowany do restrukturyzacji plików XML i może nawet importować pliki ich {{ Metoda x0}}. PHP może uruchomić skrypty XSLT 1.0 z jego PHP-XSL biblioteka. Plus, XSLT jest przenośny, można uruchomić poza PHP. Poniżej przyjmuje małe pliki XML znajdują się w tym samym katalogu, co większy plik XML:

xslt (zapisz jako plik .xsl)

<?xml version="1.0" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
   <xsl:output version="1.0" encoding="UTF-8" indent="yes" />
   <xsl:strip-space elements="*"/>

   <!-- Identity Transform -->
   <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template> 

   <!-- Rewrite cat node -->
   <xsl:template match="cat">
      <xsl:copy> 
        <xsl:apply-templates select="node1|node2|node3|date"/>
        <xsl:copy-of select="document('small_file1.xml')/gamme"/>
        <xsl:copy-of select="document('small_file2.xml')/gamme"/>
        <xsl:copy-of select="document('small_file3.xml')/gamme"/>
        ...
        <xsl:apply-templates select="*[position() &gt; 4]"/>             
      </xsl:copy>
   </xsl:template> 

</xsl:transform>

PHP

// Load the XML source and XSLT file
$doc = new DOMDocument();
$doc->load('Input.xml');

$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc);

// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);

Jeśli masz wiele małych plików XML, czy pHP uruchomić pętlę, aby zbudować XSLT (co jest w rzeczywistości specjalnym plikiem XML). Następnie mają PHP wezwanie do ostatecznego skryptu.

0
Parfait 2 marzec 2019, 03:01