略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: XMLWriter 函数

2024-11-14

XMLWriter 函数

Table of Contents

add a note add a note

User Contributed Notes 7 notes

up
8
massimo71
10 years ago
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();
?>
up
1
Carlos Averett
13 years ago
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>
up
2
benstendahl
4 years ago
XML allows for repeated nodes that an array does not support in its associative index.  To account for this we can use numerically indexed arrays.

$array = array(
    'element' => array(
        array('node' => 'some value'),
        array('node' => 'some other value')
    ),
    'key' => 'value'
);

This requires that we change the fromArray() method in the class below to check for numeric indexes and throw them away.

public function fromArray(array $array)
{
    foreach ($array as $key=>$val) {
        if (is_array($val)) {
            if (is_numeric($key)) {
                // numeric keys aren't allowed so we'll skip the key
                $this->fromArray($val);
            } else {
                $this->startElement($key);
                $this->fromArray($val);
                $this->endElement();
            }
        } else {
            $this->writeElement($key, $val);
        }
    }
}
up
1
darko at uvcms dot com
9 years ago
setElement in the previous example does exactly the same thing as already existing writeElement.
up
1
neftali dot yagua at gmail dot com
8 years ago
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();

?>
up
1
Alexandre Arica
13 years ago
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>
up
-1
Yves Sucaet
11 years ago
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"); ?>

官方地址:https://www.php.net/manual/en/ref.xmlwriter.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3