https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_XMLReader_e_XMLWriter&feed=atom&action=historyCurso POO PHP XMLReader e XMLWriter - Historial de revisiones2024-03-28T12:57:07ZHistorial de revisiones de esta página en el wikiMediaWiki 1.36.2https://manuais.iessanclemente.net/index.php?title=Curso_POO_PHP_XMLReader_e_XMLWriter&diff=36672&oldid=prevVlourido: /* XMLWriter */2013-07-25T22:58:31Z<p><span dir="auto"><span class="autocomment">XMLWriter</span></span></p>
<p><b>Página nueva</b></p><div>== XMLReader e XMLWriter ==<br />
<br />
As extensións '''[http://docs.php.net/manual/es/book.xmlreader.php XMLReader]''' e '''[http://docs.php.net/manual/es/book.xmlwriter.php XMLWriter]''' veñen habilitadas por defecto dende a versión 5.1.2 de PHP. Permiten traballar con documentos XML empregando fluxos do mesmo xeito que se fai cos ficheiros.<br />
<br />
=== XMLReader ===<br />
<br />
Empregando XMLReader podemos validar un documento a medida que se vai procesando, e detener as tarefas de procesamento en calquera momento.<br />
<br />
Para '''abrir un documento XML''', primeiro debemos crear unha instancia da '''[http://docs.php.net/manual/es/class.xmlreader.php clase XMLReader]''', e empregar un dos seguintes métodos:<br />
<br />
* '''[http://docs.php.net/manual/es/xmlreader.open.php open]'''. Abre un documento a partir dun URI.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml = new XMLReader();<br />
$xml->open('exemplo.xml');<br />
</source><br />
</div><br />
<br />
* '''[http://docs.php.net/manual/es/xmlreader.xml.php XML]'''. Abre un documento XML almacenado nunha cadea de texto.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml = new XMLReader();<br />
$xml->XML($texto);<br />
</source><br />
</div><br />
<br />
O seguinte paso é, cando sexa preciso, utilizar o método '''[http://docs.php.net/manual/es/xmlreader.setparserproperty.php setParserProperty]''' para '''establecer as [http://docs.php.net/manual/es/class.xmlreader.php#xmlreader.constants.options opcións do procesador]'''. Unha das máis empregadas é '''XMLReader::VALIDATE''', que habilita a validación mediante DTD.<br />
<br />
<source lang="php"><br />
$xml->setParserProperty(XMLReader::VALIDATE, true);<br />
</source><br />
<br />
A continuación o procedemento habitual '''crear un bucle''' que vaia chamando ao método '''[http://docs.php.net/manual/es/xmlreader.read.php read]''' para avanzar ao seguinte nodo, comprobando os tipos dos nodos coa propiedade '''[http://docs.php.net/manual/es/class.xmlreader.php#xmlreader.props.nodetype nodeType]''' ou os seus contidos con '''[http://docs.php.net/manual/es/class.xmlreader.php#xmlreader.props.value value]'''. Cando se chega ao final do documento o método ''read'' devolve ''false''. O método '''[http://docs.php.net/manual/es/xmlreader.close.php close]''' pecha o documento XML orixe.<br />
<br />
<source lang="php"><br />
while ($xml->read()) {<br />
if ($reader->nodeType == XMLREADER::ELEMENT) print $reader->localName . "<br />";<br />
}<br />
</source><br />
<br />
Algunhas das [http://docs.php.net/manual/es/class.xmlreader.php#xmlreader.constants constantes que se definen na clase XMLReader] para os tipos de nodos son:<br />
<br />
* ''XMLReader::ELEMENT''. Comenzo dun elemento.<br />
* ''XMLReader::END_ELEMENT''. Final dun elemento.<br />
* ''XMLReader::TEXT''. Texto.<br />
* ''XMLReader::PI''. Instrucción de procesamento.<br />
* ''XMLReader::COMMENT''. Comentario.<br />
<br />
Por exemplo, para obter a mesma táboa HTML da película que obtivemos con XMLParse, a partires da que figura no documento de exemplo, pódese facer:<br />
<br />
<source lang="php"><br />
$xml = new XMLReader();<br />
$xml->open('exemplo.xml');<br />
<br />
while ($xml->read()) {<br />
switch($xml->nodeType) {<br />
case XMLREADER::ELEMENT:<br />
$nome_nodo = $xml->localName;<br />
switch ($nome_nodo) {<br />
case 'película' :<br />
echo '<table>';<br />
break;<br />
case "título":<br />
echo '<tr> <th colspan="2">';<br />
break; <br />
case "títuloorixinal":<br />
echo ' (';<br />
break;<br />
case "director":<br />
case "xénero":<br />
case "duración":<br />
echo '<tr><td>' . $nome_nodo . '</td><td>'; <br />
}<br />
break;<br />
case XMLReader::END_ELEMENT:<br />
switch($xml->localName) {<br />
case "película":<br />
echo '</table>';<br />
break;<br />
case "títuloorixinal":<br />
echo ')</th></tr>';<br />
break;<br />
case "director":<br />
echo '</td></tr>';<br />
}<br />
$nome_nodo = "";<br />
break; <br />
case XMLReader::TEXT:<br />
switch($nome_nodo) {<br />
case "película":<br />
case "título":<br />
case "títuloorixinal":<br />
case "director":<br />
case "xénero":<br />
case "duración":<br />
echo $xml->value;<br />
}<br />
}<br />
}<br />
<br />
$xml->close();<br />
</source><br />
<br />
Unha forma sinxela de percorrer os atributos dun elemento é empregando a propiedade '''[http://docs.php.net/manual/es/class.xmlreader.php#xmlreader.props.hasattributes hasAttributes]''', que indica se o elemento ten ou non atributos, e o método '''[http://docs.php.net/manual/es/xmlreader.movetonextattribute.php moveToNextAttribute]''' para movernos de un en un.<br />
<br />
<source lang="php"><br />
...<br />
case XMLREADER::ELEMENT:<br />
if($xml->hasAttributes)<br />
while($xml->moveToNextAttribute()) <br />
echo 'Atributo ' . $xml->localName . ', valor = "' . $xml->value . '" <br />';<br />
...<br />
</source><br />
<br />
==== Validación ====<br />
<br />
XMLReader pode validar o documento conforme o vai lendo. Admite tres tipos de validación.<br />
<br />
* Mediante '''DTD'''. Para activar a validación por DTD, débense establecer as seguintes opcións:<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->setParserProperty(XMLReader::LOADDTD, TRUE); <br />
$xml->setParserProperty(XMLReader::VALIDATE, TRUE);<br />
</source><br />
</div><br />
<br />
* Mediante '''XML Schema'''. Neste caso será necesario empregar o método '''[http://docs.php.net/manual/es/xmlreader.setschema.php setSchema]''' `para indicar a ubicación do documento de validación.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->setSchema('esquema.xsd');<br />
</source><br />
</div><br />
<br />
* Mediante '''Relax NG'''. Temos dúas posibilidades: indicar o arquivo de validación con '''[http://docs.php.net/manual/es/xmlreader.setrelaxngschema.php setRelaxNGSchema]''' ou unha cadea de texto co seu contido con '''[http://docs.php.net/manual/es/xmlreader.setrelaxngschemasource.php setRelaxNGSchemaSource]'''.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->setRelaxNGSchemaSource('esquema.rng');<br />
</source><br />
</div><br />
<br />
En calquera dos casos anteriores, o método '''[http://docs.php.net/manual/es/xmlreader.isvalid.php isValid]''' devolverá ''true'' se o que se leva lido do documento é valido ou ''false'' en caso contrario.<br />
<br />
<source lang="php"><br />
$xml = new XMLReader();<br />
$xml->open('exemplo.xml');<br />
$xml->setSchema('esquema.xsd');<br />
<br />
while ($xml->read()) {<br />
...<br />
}<br />
if(!$xml->is_valid()) exit('Erro de validación do documento XML!');<br />
</source><br />
<br />
=== XMLWriter ===<br />
<br />
XMLWriter é a contrapartida de XMLReader. Aporta unha forma sinxela de crear documentos XML ben formados. O seu funcionamento é semellante ao de XMLReader.<br />
<br />
Para '''crear un documento XML''', primeiro debemos crear unha instancia da '''clase XMLWriter''', e empregar un dos seguintes métodos:<br />
<br />
* '''[http://docs.php.net/manual/es/function.xmlwriter-open-uri.php openURI]'''. Almacena o documento XML nun URI.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml = new XMLWriter();<br />
$xml->openURI('exemplo.xml');<br />
</source><br />
</div><br />
<br />
* '''[http://docs.php.net/manual/es/function.xmlwriter-open-memory.php openMemory]'''. Almacena o documento XML en memoria.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml = new XMLWriter();<br />
$xml->openMemory();<br />
</source><br />
</div><br />
<br />
:Neste caso empregando o método '''[http://docs.php.net/manual/es/function.xmlwriter-output-memory.php outputMemory]''' obteremos o documento XML que levamos escrito en memoria.<br />
<br />
Posteriormente para '''crear o contido do documento''', deberemos empregar chamadas aos distintos métodos ''start...'', ''end...'' ou ''write...''.<br />
<br />
* Para '''crear un novo elemento''', podemos emprear o método '''[http://docs.php.net/manual/es/function.xmlwriter-write-element.php writeElement]''' indicando o seu nome e o seu contido<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->writeElement('xénero', 'Acción'); <br />
</source><br />
</div><br />
<br />
: Ou chamar primeiro a '''[http://docs.php.net/manual/es/function.xmlwriter-start-element.php startElement]''' indicando o seu nome, e despois a '''[http://docs.php.net/manual/es/function.xmlwriter-end-element.php endElement]'''. Deste xeito entre as dúas chamadas poderemos crear atributos para o elemento con '''[http://docs.php.net/manual/es/function.xmlwriter-start-attribute.php startAttribute]''' e '''[http://docs.php.net/manual/es/function.xmlwriter-end-attribute.php endAttribute]''' ou directamente con '''[http://docs.php.net/manual/es/function.xmlwriter-write-attribute.php writeAttribute]'''.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->startElement('importe'); <br />
$xml->writeAttribute('moneda', 'dólar'); <br />
$xml->endElement(); <br />
</source><br />
</div><br />
<br />
* Do mesmo xeito tamén é posible '''crear comentarios''' ('''[http://docs.php.net/manual/es/function.xmlwriter-start-comment.php startComment]''' con '''[http://docs.php.net/manual/es/function.xmlwriter-end-comment.php endComment]''', ou '''[http://docs.php.net/manual/es/function.xmlwriter-write-comment.php writeComment]'''), '''instruccións de procesamento''' ('''[http://docs.php.net/manual/es/function.xmlwriter-start-pi.php startPI]''' con '''[http://docs.php.net/manual/es/function.xmlwriter-end-pi.php endPI]''', ou '''[http://docs.php.net/manual/es/function.xmlwriter-write-pi.php writePI]'''), etc.<br />
<br />
* Para '''crear texto''' chamaremos ao método '''[http://docs.php.net/manual/es/function.xmlwriter-text.php text]''' indicando o seu contido<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml->startElement('importe'); <br />
$xml->writeAttribute('moneda', 'dólar');<br />
$xml->text('13.56');<br />
$xml->endElement();<br />
</source><br />
</div><br />
<br />
* Para '''crear a declaración XML''' emprégase o método '''[http://docs.php.net/manual/es/function.xmlwriter-start-document.php startDocument]''', indicando opcionalmente a versión da linguaxe e o sistema de codificación empregado. Do mesmo xeito, cando remata o noso documento deberemos indicarlo chamando ao método '''[http://docs.php.net/manual/es/function.xmlwriter-end-document.php endDocument]'''.<br />
<br />
<div style="margin-left: 2em;"><br />
<source lang="php"><br />
$xml = new XMLWriter();<br />
$xml->openURI('exemplo.xml');<br />
$xml->startDocument('1.0', 'UTF-8'); <br />
...<br />
$xml->endDocument();<br />
</source><br />
</div><br />
<br />
* O método '''[http://docs.php.net/manual/es/function.xmlwriter-flush.php flush]''' volca os búferes no disco. Debe chamarse para finalizar as labores de escritura. No caso de gardar o documento XML en memoria, devolve o seu contido.<br />
<br />
Por exemplo, o seguinte código crea un documento XML semellante ao documento de exemplo (sen os elementos "<actor>").<br />
<br />
<source lang="php"><br />
$xml = new XMLWriter();<br />
$xml->openURI('exemplo.xml');<br />
$xml->setIndent(true);<br />
<br />
$xml->startDocument('1.0', 'UTF-8'); <br />
$xml->startElement('videoteca'); <br />
$xml->writeAttribute('data_creación', '24/02/2009'); <br />
$xml->startElement('película'); <br />
$xml->writeAttribute('id', '1'); <br />
$xml->startElement('importe'); <br />
$xml->writeAttribute('moneda', 'dólar');<br />
$xml->text('13.56');<br />
$xml->endElement();<br />
$xml->writeElement('título', 'El Santo');<br />
$xml->writeElement('títuloorixinal', 'The Saint');<br />
$xml->writeElement('ano', '1997');<br />
$xml->writeElement('director', 'Phillip Noyce');<br />
$xml->writeElement('xénero', 'Acción');<br />
$xml->writeElement('duración', '111');<br />
$xml->writeComment(' Elisabeth Shue ');<br />
$xml->startElement('actúa'); <br />
$xml->writeAttribute('id', '51');<br />
$xml->endElement();<br />
$xml->writeComment(' Val Kilmer ');<br />
$xml->startElement('actúa'); <br />
$xml->writeAttribute('id', '156');<br />
$xml->endElement();<br />
$xml->endElement(); // Remata o elemento "película"<br />
$xml->endElement(); // Remata o elemento "videoteca"<br />
$xml->endDocument();<br />
<br />
$xml->flush();<br />
</source><br />
<br />
O método '''[http://docs.php.net/manual/es/function.xmlwriter-set-indent.php setIndent]''' habilita ou inhabilita a indentación, mellorando a lexibilidade do documento resultante.<br />
<br />
<br />
--[[Usuario:Vlourido|Víctor Lourido]] 01:24 25 jul 2013 (CEST)</div>Vlourido