savexml - ¿Cómo se lee entre delimitadores en php DOM de un archivo XML?
savexml php (2)
Fácil en XSLT 2.0 / 3.0. Primero reorganice el XML en una estructura más sensible:
<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>
Luego, para procesar una página seleccionada:
<xsl:param name="page-num"/>
<xsl:template match="page[@n = $page-num]">
<xsl:apply-templates/>
</xsl:template>
Puede ejecutar XSLT 2.0 / 3.0 desde PHP usando el procesador Saxon / C. No es necesario sumergirse en la manipulación DOM de bajo nivel.
Tengo algunos archivos XML y los tengo que leer y convertir en HTML.
El formato del XML es este:
<book pages="2">
<page n="1" />
<entry>
...
</entry>
<entry>
...
</entry>
<entry>
...
</entry>
<page n="2" />
<entry>
...
</entry>
<entry>
...
</entry>
<entry>
...
</entry>
<endpages />
</book>
¿Cómo puedo extraer una matriz de entradas solo de una sola página?
¡Gracias por adelantado!
Sugerí usar XPath para esto en mi comentario original , sin embargo, he estado jugando con algunas expresiones XPath para esto usando una combinación de following-sibling
preceding-sibling
pero no puedo hacer que funcione correctamente con esta estructura XML .
Una forma un poco chistosa de hacer esto es simplemente obtener todo después de un número de página dado, y detenerse cuando encuentre el siguiente elemento <page />
o <endpages />
:
$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
}
Estoy bastante seguro de que no funcionará muy bien si tienes muchas páginas en el archivo XML y estás tratando de obtener solo los elementos de la página uno, pero en términos de líneas de código esto es supervisable y tal vez alguien más tiene algunas ideas sobre cómo optimizar la expresión XPath.