Buscar..
Crea un archivo XML usando XMLWriter
Crea una instancia de un objeto XMLWriter:
$xml = new XMLWriter();
A continuación abra el archivo en el que desea escribir. Por ejemplo, para escribir en /var/www/example.com/xml/output.xml
, use:
$xml->openUri('file:///var/www/example.com/xml/output.xml');
Para iniciar el documento (crear la etiqueta abierta XML):
$xml->startDocument('1.0', 'utf-8');
Esto dará como resultado:
<?xml version="1.0" encoding="UTF-8"?>
Ahora puedes empezar a escribir elementos:
$xml->writeElement('foo', 'bar');
Esto generará el XML:
<foo>bar</foo>
Si necesita algo un poco más complejo que simplemente nodos con valores simples, también puede "iniciar" un elemento y agregarle atributos antes de cerrarlo:
$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();
Esto dará como resultado:
<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>
Leer un documento XML con DOMDocument
De manera similar a SimpleXML, puede usar DOMDocument para analizar XML desde una cadena o desde un archivo XML
1. De una cuerda
$doc = new DOMDocument();
$doc->loadXML($string);
2. De un archivo
$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative
Ejemplo de análisis
Teniendo en cuenta el siguiente XML:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id>1</id>
</book>
<book>
<name>PHP - Advanced</name>
<price>$25.00</price>
<id>2</id>
</book>
</books>
Este es un código de ejemplo para analizarlo.
$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
$title = $book->getElementsByTagName('name')->item(0)->nodeValue;
$price = $book->getElementsByTagName('price')->item(0)->nodeValue;
$id = $book->getElementsByTagName('id')->item(0)->nodeValue;
print_r ("The title of the book $id is $title and it costs $price." . "\n");
}
Esto dará como resultado:
El título del libro 1 es PHP - Una introducción y cuesta $ 5.95.
El título del libro 2 es PHP - Advanced y cuesta $ 25.00.
Crea un XML utilizando DomDocument
Para crear un XML usando DOMDocument, básicamente, necesitamos crear todas las etiquetas y atributos usando los createElement()
y createAttribute()
y ellos crean la estructura XML con appendChild()
.
El siguiente ejemplo incluye etiquetas, atributos, una sección CDATA y un espacio de nombres diferente para la segunda etiqueta:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
//create the main tags, without values
$books = $dom->createElement('books');
$book_1 = $dom->createElement('book');
// create some tags with values
$name_1 = $dom->createElement('name', 'PHP - An Introduction');
$price_1 = $dom->createElement('price', '$5.95');
$id_1 = $dom->createElement('id', '1');
//create and append an attribute
$attr_1 = $dom->createAttribute('version');
$attr_1->value = '1.0';
//append the attribute
$id_1->appendChild($attr_1);
//create the second tag book with different namespace
$namespace = 'www.example.com/libraryns/1.0';
//include the namespace prefix in the books tag
$books->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns', $namespace);
$book_2 = $dom->createElementNS($namespace,'ns:book');
$name_2 = $dom->createElementNS($namespace, 'ns:name');
//create a CDATA section (that is another DOMNode instance) and put it inside the name tag
$name_cdata = $dom->createCDATASection('PHP - Advanced');
$name_2->appendChild($name_cdata);
$price_2 = $dom->createElementNS($namespace, 'ns:price', '$25.00');
$id_2 = $dom->createElementNS($namespace, 'ns:id', '2');
//create the XML structure
$books->appendChild($book_1);
$book_1->appendChild($name_1);
$book_1->appendChild($price_1);
$book_1->appendChild($id_1);
$books->appendChild($book_2);
$book_2->appendChild($name_2);
$book_2->appendChild($price_2);
$book_2->appendChild($id_2);
$dom->appendChild($books);
//saveXML() method returns the XML in a String
print_r ($dom->saveXML());
Esto generará el siguiente XML:
<?xml version="1.0" encoding="utf-8"?>
<books xmlns:ns="www.example.com/libraryns/1.0">
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id version="1.0">1</id>
</book>
<ns:book>
<ns:name><![CDATA[PHP - Advanced]]></ns:name>
<ns:price>$25.00</ns:price>
<ns:id>2</ns:id>
</ns:book>
</books>
Lee un documento XML con SimpleXML
Puede analizar XML desde una cadena o desde un archivo XML
1. De una cuerda
$xml_obj = simplexml_load_string($string);
2. De un archivo
$xml_obj = simplexml_load_file('books.xml');
Ejemplo de análisis
Teniendo en cuenta el siguiente XML:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id>1</id>
</book>
<book>
<name>PHP - Advanced</name>
<price>$25.00</price>
<id>2</id>
</book>
</books>
Este es un código de ejemplo para analizarlo.
$xml = simplexml_load_string($xml_string);
$books = $xml->book;
foreach ($books as $book) {
$id = $book->id;
$title = $book->name;
$price = $book->price;
print_r ("The title of the book $id is $title and it costs $price." . "\n");
}
Esto dará como resultado:
El título del libro 1 es PHP - Una introducción y cuesta $ 5.95.
El título del libro 2 es PHP - Advanced y cuesta $ 25.00.
Aprovechando XML con la biblioteca SimpleXML de PHP
SimpleXML es una biblioteca potente que convierte cadenas XML en un objeto PHP fácil de usar.
Lo siguiente asume una estructura XML como a continuación.
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>
Lea nuestros datos en SimpleXML
Para comenzar, necesitamos leer nuestros datos en SimpleXML. Podemos hacer esto de 3 maneras diferentes. En primer lugar, podemos cargar nuestros datos desde un nodo DOM.
$xmlElement = simplexml_import_dom($domNode);
Nuestra siguiente opción es cargar nuestros datos desde un archivo XML.
$xmlElement = simplexml_load_file($filename);
Por último, podemos cargar nuestros datos desde una variable.
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>';
$xmlElement = simplexml_load_string($xmlString);
Ya sea que haya elegido cargar desde un elemento DOM , desde un archivo o desde una cadena , ahora se queda con una variable SimpleXMLElement llamada $xmlElement
. Ahora, podemos empezar a utilizar nuestro XML en PHP.
Accediendo a nuestros datos SimpleXML
La forma más sencilla de acceder a los datos en nuestro objeto SimpleXMLElement es llamar directamente a las propiedades . Si queremos acceder a nuestro primer nombre de libro, StackOverflow SimpleXML Example
, entonces podemos acceder a él como se muestra a continuación.
echo $xmlElement->book->bookName;
En este punto, SimpleXML asumirá que, como no le hemos dicho explícitamente qué libro queremos, que queremos que sea el primero. Sin embargo, si decidimos que no queremos el primero, sino que queremos Another SimpleXML Example
, entonces podemos acceder a él como se muestra a continuación.
echo $xmlElement->book[1]->bookName;
Vale la pena señalar que usar [0]
funciona igual que no usarlo, por lo que
$xmlElement->book
funciona igual que
$xmlElement->book[0]
Recorriendo nuestro XML
Hay muchas razones por las que puede desear pasar por XML , como por ejemplo que tiene varios artículos, libros en nuestro caso, que nos gustaría mostrar en una página web. Para esto, podemos usar un bucle foreach o un estándar para el bucle , aprovechando la función de conteo de SimpleXMLElement. .
foreach ( $xmlElement->book as $thisBook ) {
echo $thisBook->bookName
}
o
$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
echo $xmlElement->book[$i]->bookName;
}
Errores de manejo
Ahora que hemos llegado hasta ahora, es importante que nos demos cuenta de que solo somos seres humanos, y es probable que encontremos un error con el tiempo, especialmente si jugamos con diferentes archivos XML todo el tiempo. Y así, vamos a querer manejar esos errores.
Considera que hemos creado un archivo XML. Notará que mientras este XML es muy similar al que teníamos anteriormente, el problema con este archivo XML es que la etiqueta de cierre final es / doc en lugar de / document.
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</doc>
Ahora, digamos, cargamos esto en nuestro PHP como archivo $.
libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
$errors = libxml_get_errors();
foreach ( $errors as $thisError ) {
switch ( $thisError->level ) {
case LIBXML_ERR_FATAL:
echo "FATAL ERROR: ";
break;
case LIBXML_ERR_ERROR:
echo "Non Fatal Error: ";
break;
case LIBXML_ERR_WARNING:
echo "Warning: ";
break;
}
echo $thisError->code . PHP_EOL .
'Message: ' . $thisError->message . PHP_EOL .
'Line: ' . $thisError->line . PHP_EOL .
'Column: ' . $thisError->column . PHP_EOL .
'File: ' . $thisError->file;
}
libxml_clear_errors();
} else {
echo 'Happy Days';
}
Nos saludarán con el siguiente
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
Sin embargo, tan pronto como solucionamos este problema, se nos presentan los "Días felices".