2017-10-29 1 views
2

Ich habe einige XML-Dateien und ich muss sie in HTML lesen und konvertieren.Wie lesen zwischen Trennzeichen in PHP DOM einer XML-Datei?

Das Format der XML ist dies:

<book pages="2"> 

    <page n="1" /> 

    <entry> 
     ... 
    </entry> 
    <entry> 
     ... 
    </entry> 
    <entry> 
     ... 
    </entry> 

    <page n="2" /> 

    <entry> 
     ... 
    </entry> 
    <entry> 
     ... 
    </entry> 
    <entry> 
     ... 
    </entry> 

    <endpages /> 

</book> 

Wie ich nur von einer einzigen Seite eine Reihe von Einträgen extrahieren?

Vielen Dank im Voraus!

+0

Können Sie die Struktur ändern? Die Seiten sollten die Einträge enthalten. – chris85

+0

@ chris85 Sie sind 110 Dateien benötigen dann zu viel Zeit –

+1

Schauen Sie in ['DOMXPath'] (http://php.net/manual/en/class.domxpath.php), wenn Sie bereits ein' DOMDocument' von Ihrem XML haben Datei. Dann können Sie eine XPath-Abfrage verwenden, um alle "" -Tags unter einem '' mit einem bestimmten 'n =" x "' - Attribut auszuwählen. – rickdenhaan

Antwort

1

Ich schlug vor, in my original comment für diese XPath verwenden, aber ich habe mit einigem von XPath-Ausdrücken für diese mit einer Kombination aus following-sibling und preceding-sibling aber ich kann nicht damit es funktioniert richtig mit dieser XML-Struktur herum spielen.

Ein bisschen ein hacky Weg, dies zu tun, indem sie alles nach einer bestimmten Seitenzahl nur holen ist, und stoppt, wenn Sie das nächste <page /> oder <endpages /> Element finden:

$dom = new DOMDocument("1.0", "UTF-8"); 
$dom->load($xmlFile); 

$xp = new DOMXPath($dom); 

$pageNo = 2; 

$list = $xp->query("/book/page[@n='" . $pageNo . "']/following-sibling::*"); 

foreach ($list as $node) { 
    if ($node->nodeName == 'page' || $node->nodeName == 'endpages') { 
     break; 
    } 

    echo $node->textContent . "<br />"; // <entry /> node 
} 

bin ich ziemlich sicher, dass dies Es funktioniert nicht sehr gut, wenn Sie viele Seiten in der XML-Datei haben und nur die Elemente der ersten Seite abrufen wollen, aber in Bezug auf Codezeilen ist dies überschaubar und vielleicht hat jemand anderes ein paar Ideen zur Optimierung der XPath-Ausdruck

+0

Im Moment ist dies die beste Lösung, die ich gefunden habe, danke –

0

Einfach in XSLT 2.0/3.0. Erste reorganisieren die XML-Daten in einer sinnvolleren Struktur:

<xsl:template match="book"> 
<book> 
    <xsl:for-each-group select="* except endpages" group-starting-with="page"> 
    <page n="{@n}"> 
     <xsl:copy-of select="current-group() except self::page"/> 
    </page> 
    </xsl:for-each-group> 
</book> 
</xsl:template> 

Dann eine ausgewählte Seite zu verarbeiten:

<xsl:param name="page-num"/> 
<xsl:template match="page[@n = $page-num]"> 
    <xsl:apply-templates/> 
</xsl:template> 

Sie XSLT 2.0/3.0 von PHP ausführen können die Saxon/C-Prozessor. Sie müssen nicht in Low-Level-DOM-Manipulation eintauchen.

+3

Ich hasse es, wenn Leute eine Antwort downvote ohne Angabe eines Grundes. Ich kann mir vorstellen, dass einige Leute diese Antwort ablehnen, weil sie es vorziehen, 100 Zeilen DOM-Code in 20 Zeilen XSLT-Code zu schreiben. Aber die Antwort nicht zu mögen, macht es nicht falsch. –

+0

Ich habe dich und IDK, die dich herabgestuft haben, nicht abgelehnt. Jetzt habe ich dich upvoted :). Wie auch immer, deine Methode ist die beste, die ich gefunden habe und ich habe sie schon gesehen, aber leider benötigt sie einen Server mit Saxon und das ist ein Problem für mich, weil ich auf diesem Server kein Privileg habe. @Michael –

Verwandte Themen