Inspired in the XmlConstruct.
<?php
class XLIFFConstruct extends XMLWriter
{
/**
* Constructor.
* @param string $prm_rootElementName A root element's name of a current xml document
* @param string $prm_xsltFilePath Path of a XSLT file.
* @access public
* @param null
*/
var $_phrase_id=1;
public function __construct(){
$this->openMemory();
$this->setIndent(true);
$this->setIndentString(' ');
$this->startDocument('1.0', 'UTF-8');
if($prm_xsltFilePath){
$this->writePi('xml-stylesheet', 'type="text/xsl" href="'.$prm_xsltFilePath.'"');
}
$this->startElement('xliff');
$this->writeAttribute('version', '1.0');
$this->startElement('file');
$this->writeAttribute('original', 'global');
$this->writeAttribute('source-language', 'es');
$this->writeAttribute('datatype', 'plaintext');
$this->writeAttribute('date', date('c'));
$this->startElement('body');
}
public function addPhrase($source, $target){
$this->startElement('trans-unit');
$this->writeAttribute('id', $this->_phrase_id++);
$this->startElement('source');
$this->text($source);
$this->endElement();
$this->startElement('target');
$this->text($target);
$this->endElement();
$this->endElement();
}
public function getDocument(){
$this->endElement();
$this->endElement();
$this->endElement();
$this->endDocument();
return $this->outputMemory();
}
public function output(){
header('Content-type: text/xml');
echo $this->getDocument();
}
}
?>
Example:
<?php
$xliff = new XLIFFConstruct();
$xliff->addPhrase('source','target');
$xliff->addPhrase('add','añadir');
$xliff->addPhrase('open','abrir');
$xliff->addPhrase('change','cambiar');
$xliff->addPhrase('new','nuevo');
$xliff->addPhrase('save','guardar');
echo $xliff->getDocument();
?>
CLXXIX. XMLWriter-Funktionen
Einführung
Die XMLWriter-Erweiterung ist ein Wrapper für die libxml xmlWriter-API.
Diese Erweiterung bietet ein nicht zwischenspeichernden, fortschreitenden Schreiber zum Erzeugen von Datenströmen oder Dateien mit XML-Inhalten.
Diese Erweiterung kann sowohl objektorientiert, als auch prozedural verwendet werden. Jede dokumentiert Methode beschreibt auch den entsprechenden prozeduralen Aufruf.
Vordefinierte Klassen
XMLWriter->endAttribute() - Beendet aktuelles Attribut
XMLWriter->endCData() - Beendet aktuellen CDATA-Block
XMLWriter->endComment() - Beendet aktuellen Kommentar
XMLWriter->endDocument() - Beendet aktuelles Dokument
XMLWriter->endDTDAttlist() - Beendet aktuelle DTD-Attributliste
XMLWriter->endDTDElement() - Beendet aktuelles DTD-Element
XMLWriter->endDTDEntity() - Beendet aktuelle DTD-Entität
XMLWriter->endDTD() - Beendet aktuelle DTD
XMLWriter->endElement() - Beendet aktuelles Element
XMLWriter->endPI() - Beendet aktuelle Verarbeitunsvorschrift
XMLWriter->flush() - Schreibt Puffer
XMLWriter->fullEndElement() - Beendet aktuelles Element
XMLWriter->openMemory() - Erzeugt neuen XMLWriter, der Speicher für Ausgabe verwendet
XMLWriter->openURI() - Erzeugt neuen XMLWriter, der URI für Ausgabe verwendet
XMLWriter->outputMemory() - Gibt Puffer zurück
XMLWriter->setIndentString() - Setzt Zeichenkette, die zur Einrückung verwendet wird
XMLWriter->setIndent() - Einrückung ein-/ausschalten
XMLWriter->startAttributeNS() - Namensraum-Attribut beginnen
XMLWriter->startAttribute() - Attribut beginnen
XMLWriter->startCData() - CDATA-Block beginnen
XMLWriter->startComment() - Kommentar beginnen
XMLWriter->startDocument() - Dokument beginnen
XMLWriter->startDTDAttlist() - DTD-Attributliste beginnen
XMLWriter->startDTDElement() - DTD-Element beginnen
XMLWriter->startDTDEntity() - DTD-Entität beginnen
XMLWriter->startDTD() - DTD beginnen
XMLWriter->startElementNS() - Element mit Namensraum beginnen
XMLWriter->startElement() - Element beginnen
XMLWriter->startPI() - Verarbeitungsvorschrift beginnen
XMLWriter->text() - Text schreiben
XMLWriter->writeAttributeNS() - Komplettes Attribute mit Namensraum schreiben
XMLWriter->writeAttribute() - Komplettes Attribut schreiben
XMLWriter->writeCData() - Kompletten CDATA-Block schreiben
XMLWriter->writeComment() - Kompletten Kommentar-Tag schreiben
XMLWriter->writeDTDAttlist() - Komplette DTD-Attributliste schreiben
XMLWriter->writeDTDElement() - Komplettes DTD-Element schreiben
XMLWriter->writeDTDEntity() - Komplette DTD-Entität schreiben
XMLWriter->writeDTD() - Kompletten DTD-Tag schreiben
XMLWriter->writeElementNS() - Komplettes Element mit Namensraum schreiben
XMLWriter->writeElement() - Komplettes Element schreiben
XMLWriter->writePI() - Komplette Verarbeitungsvorschrift-Tag schreiben
XMLWriter->writeRaw() - Reines XML schreiben
Resource Typen
In der prozeduralen Version der XMLWriter-Extension wird nur eine Ressource verwendet. Diese wird von xmlwriter_open_memory() oder xmlwriter_open_uri() zurückgegeben.
Vordefinierte Konstanten
Diese Erweiterung definiert keine Konstanten.
Inhaltsverzeichnis
- XMLWriter->endAttribute() — Attribute beenden
- XMLWriter->endCData() — Beendet CDATA-Block
- XMLWriter->endComment() — Beendet Kommentar
- XMLWriter->endDocument() — Beendet Dokument
- XMLWriter->endDTDAttlist() — Beendet DTD-Attributliste
- XMLWriter->endDTDElement() — Beendet DTD-Element
- XMLWriter->endDTDEntity() — Beendet DTD-Entität
- XMLWriter->endDTD() — Beendet DTD
- XMLWriter->endElement() — Beendet Element
- XMLWriter->endPI() — Beendet Verarbeitungsvorschrift
- XMLWriter->flush() — Puffer schreiben
- XMLWriter->fullEndElement() — Beendet Element
- XMLWriter->openMemory() — Erzeugt neuen XMLWriter, der Speicher für Ausgabe verwendet
- XMLWriter->openURI() — Erzeugt neuen XMLWriter, der URI für Ausgabe verwendet
- XMLWriter->outputMemory() — Gibt Puffer zurück
- XMLWriter->setIndentString() — Setzt Zeichenkette, die zur Einrückung verwendet wird
- XMLWriter->setIndent() — Einrückung ein-/ausschalten
- XMLWriter->startAttributeNS() — Namensraum-Attribut beginnen
- XMLWriter->startAttribute() — Attribut beginnen
- XMLWriter->startCData() — CDATA-Block beginnen
- XMLWriter->startComment() — Kommentar beginnen
- XMLWriter->startDocument() — Dokument beginnen
- XMLWriter->startDTDAttlist() — DTD-Attributliste beginnen
- XMLWriter->startDTDElement() — DTD-Element beginnen
- XMLWriter->startDTDEntity() — DTD-Entität beginnen
- XMLWriter->startDTD() — DTD beginnen
- XMLWriter->startElementNS() — Element mit Namensraum beginnen
- XMLWriter->startElement() — Element beginnen
- XMLWriter->startPI() — Verarbeitungsvorschrift beginnen
- XMLWriter->text() — Text schreiben
- XMLWriter->writeAttributeNS() — Komplettes Attribute mit Namensraum schreiben
- XMLWriter->writeAttribute() — Komplettes Attribut schreiben
- XMLWriter->writeCData() — Kompletten CDATA-Block schreiben
- XMLWriter->writeComment() — Kompletten Kommentar schreiben
- XMLWriter->writeDTDAttlist() — Komplette DTD-Attributliste schreiben
- XMLWriter->writeDTDElement() — Komplettes DTD-Element schreiben
- XMLWriter->writeDTDEntity() — Komplette DTD-Entität schreiben
- XMLWriter->writeDTD() — Komplettes DTD-Tag schreiben
- XMLWriter->writeElementNS() — Komplettes Element mit Namensraum schreiben
- XMLWriter->writeElement() — Komplettes Element schreiben
- XMLWriter->writePI() — Komplette Verarbeitungsvorschrift-Tag schreiben
- XMLWriter->writeRaw() — Reines XML schreiben
setElement in the previous example does exactly the same thing as already existing writeElement.
I had a feature to the XmlConstruct class by Alexandre Aprica. Now you can use nested array to generate nested xml elements.
<?php
class XmlConstruct extends XMLWriter
{
/**
* Constructor.
* @param string $prm_rootElementName A root element's name of a current xml document
* @param string $prm_xsltFilePath Path of a XSLT file.
* @access public
* @param null
*/
public function __construct($prm_rootElementName, $prm_xsltFilePath=''){
$this->openMemory();
$this->setIndent(true);
$this->setIndentString(' ');
$this->startDocument('1.0', 'UTF-8');
if($prm_xsltFilePath){
$this->writePi('xml-stylesheet', 'type="text/xsl" href="'.$prm_xsltFilePath.'"');
}
$this->startElement($prm_rootElementName);
}
/**
* Set an element with a text to a current xml document.
* @access public
* @param string $prm_elementName An element's name
* @param string $prm_ElementText An element's text
* @return null
*/
public function setElement($prm_elementName, $prm_ElementText){
$this->startElement($prm_elementName);
$this->text($prm_ElementText);
$this->endElement();
}
/**
* Construct elements and texts from an array.
* The array should contain an attribute's name in index part
* and a attribute's text in value part.
* @access public
* @param array $prm_array Contains attributes and texts
* @return null
*/
public function fromArray($prm_array){
if(is_array($prm_array)){
foreach ($prm_array as $index => $element){
if(is_array($element)){
$this->startElement($index);
$this->fromArray($element);
$this->endElement();
}
else
$this->setElement($index, $element);
}
}
}
/**
* Return the content of a current xml document.
* @access public
* @param null
* @return string Xml document
*/
public function getDocument(){
$this->endElement();
$this->endDocument();
return $this->outputMemory();
}
/**
* Output the content of a current xml document.
* @access public
* @param null
*/
public function output(){
header('Content-type: text/xml');
echo $this->getDocument();
}
}
Example:
$contents = array(
'page_title' => 'Generate a XHTML page from XML+XSLT files',
'welcome_msg' => 'Simple XHTML document from XML+XSLT files!',
'prova' => array(
"gino" => array(
"innergino" => "gino inner value"
),
"filo" => "filodata"
),
);
$XmlConstruct = new XmlConstruct('root');
$XmlConstruct->fromArray($contents);
$XmlConstruct->output();
?>
If you want your XML-output to be seen as XML by the browser, you need to modify your header. The XmlWriter does not do this for you! Therefore, the first line of your script should be:
<?php header("Content-type: text/xml"); ?>
How to generate a simple XML document for a XSL-Transformation purpose.
We have 3 files:
- 'index.php' : output a XML document
- 'XmlConstruct.class.php' : allow to construct a XML document with 'xmlwriter'
- 'index.xsl' : contains a XSLT document
Contents of the file 'index.php' :
<?php
$contents = array('page_title' => 'Generate a XHTML page from XML+XSLT files',
'welcome_msg' => 'Simple XHTML document from XML+XSLT files!');
require('XmlConstruct.class.php');
$XmlConstruct = new XmlConstruct('rootElement', 'index.xsl');
$XmlConstruct->fromArray($contents);
$XmlConstruct->output();
?>
Contents of the file 'XmlConstruct.class.php' :
<?php
/**
* Construct a simple XML document.
* This class inherits from the (PHP) class 'xmlwriter'.
* You will need at least PHP 5.1.2
*
* @author Alexandre Arica
* @since 16 April 2006
* @version 1.0 modified the 16 April 2006
*/
class XmlConstruct extends XMLWriter
{
/**
* Constructor.
* @param string $prm_rootElementName A root element's name of a current xml document
* @param string $prm_xsltFilePath Path of a XSLT file.
* @access public
* @param null
*/
public function __construct($prm_rootElementName, $prm_xsltFilePath=''){
$this->openMemory();
$this->setIndent(true);
$this->setIndentString(' ');
$this->startDocument('1.0', 'UTF-8');
if($prm_xsltFilePath){
$this->writePi('xml-stylesheet', 'type="text/xsl" href="'.$prm_xsltFilePath.'"');
}
$this->startElement($prm_rootElementName);
}
/**
* Set an element with a text to a current xml document.
* @access public
* @param string $prm_elementName An element's name
* @param string $prm_ElementText An element's text
* @return null
*/
public function setElement($prm_elementName, $prm_ElementText){
$this->startElement($prm_elementName);
$this->text($prm_ElementText);
$this->endElement();
}
/**
* Construct elements and texts from an array.
* The array should contain an attribute's name in index part
* and a attribute's text in value part.
* @access public
* @param array $prm_array Contains attributes and texts
* @return null
*/
public function fromArray($prm_array){
if(is_array($prm_array)){
foreach ($prm_array as $index => $text){
$this->setElement($index, $text);
}
}
}
/**
* Return the content of a current xml document.
* @access public
* @param null
* @return string Xml document
*/
public function getDocument(){
$this->endElement();
$this->endDocument();
return $this->outputMemory();
}
/**
* Output the content of a current xml document.
* @access public
* @param null
*/
public function output(){
header('Content-type: text/xml');
echo $this->getDocument();
}
}
?>
Contents of the file 'index.xsl' :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output
method="html"
encoding="utf-8"
/>
<xsl:template match="rootElement">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><xsl:value-of select="page_title" /></title>
</head>
<body>
<xsl:value-of select="welcome_msg" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Using XMLWriter to create a WAP page:
<?php
$memory = xmlwriter_open_memory();
xmlwriter_start_document($memory,'1.0','UTF-8');
xmlwriter_start_dtd($memory,'html','-//WAPFORUM//DTD XHTML Mobile 1.0//EN', 'http://www.wapforum.org/DTD/xhtml-mobile10.dtd');
xmlwriter_end_dtd($memory);
xmlwriter_start_element ($memory,'html'); // <html>
xmlwriter_write_attribute( $memory, 'xmlns', 'http://www.wapforum.org/DTD/xhtml-mobile10.dtd');
xmlwriter_write_attribute( $memory, 'xm:lang', 'en');
xmlwriter_start_element($memory,'head'); // <head>
xmlwriter_write_element ($memory,'title', 'Test WAP Document');
xmlwriter_end_element($memory); // </head>
xmlwriter_start_element($memory,'body'); // <body>
xmlwriter_start_element($memory,'ol'); // <ol>
xmlwriter_write_element ($memory,'li', 'One Item');
xmlwriter_write_element ($memory,'li', 'Another Item');
xmlwriter_write_element ($memory,'li', 'Another Item');
xmlwriter_end_element($memory); // </ol>
xmlwriter_end_element($memory); // </body>
xmlwriter_end_element($memory); // </html>
xmlwriter_end_dtd($memory);
$xml = xmlwriter_output_memory($memory,true);
?>
Output:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.wapforum.org/DTD/xhtml-mobile10.dtd" xm:lang="en">
<head>
<title>Test WAP Document</title>
</head>
<body>
<ol>
<li>One Item</li>
<li>Another Item</li>
<li>Another Item</li>
</ol>
</body>
</html>
