![Page 1: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/1.jpg)
Streaming XML
Rob Richards
May 22, 2008
http://xri.net/=rob.richards
![Page 2: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/2.jpg)
Parsing XML
• Push Parser
–Parser scans document and emits events to execute caller’s callbacks
• Tree Parser–XML is read into memory and converted into a Tree
• Pull Parser–XML data is processed as needed and determined by
the caller
2
![Page 3: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/3.jpg)
Push Parser
<Catalogs . . .>
<Catalog ID="1993587105" zip="">
<Offers totalOffers="4">
<Offer>
<Merchant ID="1063153">
<Name>
3
Catalogs
Offers {totalOffers:4}
Catalog {ID:19.., zip:}
Offer
Merchant {ID:106..}
ConsumerProcessor
Name
![Page 4: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/4.jpg)
Tree Parser
4
<Catalogs . . .>
<Catalog ID="1993587105" zip="">
Name: CatalogsType: ElementDoc: 0x8528394Next: 0x857c35cPrev: 0x8528394
Name: #TextType: TextDoc: 0x8528394Next: 0x8578e38Prev: 0x853484c
Name: CatalogType: ElementDoc: 0x8528394Next: 0x857c35cPrev: 0x857c35c
Name: IDType: AttributeDoc: 0x8528394Next: 0x8578b8cPrev: 0x8578e38
![Page 5: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/5.jpg)
• Event based push parser
• Low memory usage
• Works using function callbacks
• Read-only
• Forward only
• No validation support
SAX (ext/xml)
5
![Page 6: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/6.jpg)
ext/xml Example
function startElement($parser, $name, $attrs) { // start element handler logic}
function endElement($parser, $name) { // end element handler logic}
$xml_parser = xml_parser_create();xml_set_element_handler($xml_parser, "startElement", "endElement");
while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) echo "ERROR!";}xml_parser_free($xml_parser);
6
![Page 7: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/7.jpg)
DOM
• Tree based parser
• Allows for creation and editing of XML documents
• Provides XPath and XInclude Support
• Provides validation support–DTD
–XML Schemas–RelaxNG
• Ability to work with HTML documents
• Zero copy interoperability with SimpleXML
7
![Page 8: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/8.jpg)
DOM Example
$dom = new DOMDocument();$dom->load(<URI>);
$root = $dom->documentElement;foreach ($root->childNodes AS $node) { if ($node->nodeType == XML_ELEMENT_NODE) { echo $node->nodeName; }}
$child = $root->firstChild;$parent = $child->parentNode;
8
![Page 9: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/9.jpg)
SimpleXML
• Tree based parser
• Provides simple access to XML documents
• Operates only on elements and attributes
• Contains XPath support
• Allows for modifications to the XML
• Zero copy interoperability with DOM
9
![Page 10: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/10.jpg)
SimpleXML Example
$sxe = simplexml_load_string('<root/>');$sxe->child = '';$sxe->child->nodea = 'A';$sxe->child->nodeb = 'B';$nodea = $sxe->child->nodea;
$nodes = $nodea->xpath('/root/child');
$childnode = $nodes[0];
echo $childnode->nodea;
$node = dim_import_simplexml($childnode);echo $node->nodeName;
10
![Page 11: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/11.jpg)
XMLReader
• It is a Pull parser
• Forward moving stream based parser
• Based on the C# XmlTextReader API
• Advantages– Low memory footprint
– Simple API
– Faster Processing
– Namespace support
– Validation support
– Advanced Feature Set
11
![Page 12: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/12.jpg)
Simple XML Document
<root>
<child cattr="123">my content</child>
<?php echo 'hello world';?>
<![CDATA[ random data ]]>
</root>
12
![Page 13: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/13.jpg)
Simple Parsing
$reader = new XMLReader();
$reader->XML($xml);
while ($reader->read())
{
echo "Name: " . $reader->name."\t";
echo "Value: " . $reader->value."\n";
}
$reader->close();
13
![Page 14: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/14.jpg)
Simple Parsing Results
Name: root Value: Name: #text Value:
Name: child Value: Name: #text Value: my contentName: child Value: Name: #text Value:
Name: php Value: echo 'hello world';Name: #text Value:
Name: #cdata-section Value: random data Name: #text Value:
Name: root Value:
14
![Page 15: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/15.jpg)
Reading Data
•XML($stringInput [, $encoding [, $options]])
- Reads and XML document loaded within a string
•open($URI [, $encoding [, $options]])
– Reads an XML document at location specified by URI
– Uses PHP streams to read the data
15
![Page 16: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/16.jpg)
Streams To The Rescue
$url = 'http://developer.ebay.com/webservices/latest/eBaySvc.wsdl';
$begin = microtime(true);
$sxe = simplexml_load_file($url);
$end = microtime(true);
echo "Root node: " . $sxe->getName() ."\n";
$total = $end - $begin;
echo "Elapsed time: " . $total."\n";
16
![Page 17: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/17.jpg)
Streams To The Rescue
Root node: definitions
Elapsed time: 20.740789175
17
![Page 18: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/18.jpg)
Streams To The Rescue
$url = 'http://developer.ebay.com/webservices/latest/eBaySvc.wsdl';$begin = microtime(true);
$reader = new XMLReader();$reader->open($url);while ($reader->read()) { if ($reader->nodeType == XMLReader::ELEMENT) { echo "Root node: " . $reader->localName ."\n"; break; }}$reader->close();$end = microtime(true);$total = $end - $begin;echo "Elapsed time: " . $total."\n";
18
![Page 19: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/19.jpg)
Streams To The Rescue
Root node: definitionsElapsed time: 0.236433029175
100X Faster!
19
![Page 20: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/20.jpg)
Memory Impact
echo "Memory used: " . memory_get_usage()."\n";
SimpleXML ExampleMemory used: 64000
XMLReader ExampleMemory used: 65448
20
![Page 21: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/21.jpg)
Real Memory Impact
echo "Memory used: " . memory_get_usage()."\n";Debug build of libxml2 used to capture its maximum memory usage
SimpleXML ExampleMemory used: 64000
libxml2 memory usage: 12980964 (13 MB)
XMLReader ExampleMemory used: 65448
libxml2 memory usage: 28098 (28 KB)
21
![Page 22: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/22.jpg)
Node Types
XMLReader::ELEMENT
XMLReader::END_ELEMENT
XMLReader::ATTRIBUTE
XMLReader::TEXT
XMLReader::CDATA
XMLReader::PI
XMLReader::COMMENT
XMLReader::WHITESPACE
XMLReader::NONE
Element opening tag
Element closing tag
Attribute
Text node
CDATA node
Processing Instruction
Comment Node
Whitespace
No Data: BOF or EOF
22
![Page 23: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/23.jpg)
Node Types
while ($reader->read()) { switch ($reader->nodeType) {
case XMLReader::ELEMENT: echo '<' . $reader->localName . '>'; break;
case XMLReader::END_ELEMENT: echo '</' . $reader->localName . '>'; break;
case XMLReader::TEXT: case XMLReader::SIGNIFICANT_WHITESPACE: echo $reader->value; }}
23
![Page 24: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/24.jpg)
Attributes
<root> <child attr1="abc" attr2="def" /> <child xmlns:pfx="urn::pfx" pfx:attr1="123" /> </root>
/* Position cursor at first child element */while ($reader->read()) { if ($reader->localName == 'child') { /* insert code here */ break; }}
24
![Page 25: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/25.jpg)
Attributes
<root> <child attr1="abc" attr2="def" /> <child xmlns:pfx="urn::pfx" pfx:attr1="123" /></root>
echo 'Attr1: ' . $reader->getAttribute("attr1") . "\n"; // Attr1: abcecho 'Attr2: ' . $reader->getAttribute("attr2") . "\n"; // Attr2: def
$reader->next('child');echo 'Attr1: ' . $reader->getAttribute("attr1") . "\n"; // Attr1:echo 'Attr1: ' . $reader->getAttributeNS("attr1", "urn::pfx") . "\n"; // Attr1: 123
echo 'Attr1: ' . $reader->getAttributeNo(1) . "\n"; // Attr1: 123echo 'Attr1: ' . $reader->getAttributeNo(0) . "\n"; // Attr1: urn::pfx
25
![Page 26: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/26.jpg)
Attributes
<root> <child attr1="abc" attr2="def" /> <child xmlns:pfx="urn::pfx" pfx:attr1="123" /></root>
$reader->moveToFirstAttribute();echo $reader->name . ': ' . $reader->value."\n"; // attr1: abcwhile ($reader->moveToNextAttribute()) { echo $reader->name . ': ' . $reader->value."\n"; // attr2: def} $reader->moveToElement();$reader->next('child');$reader->moveToAttributeNo(0);echo $reader->name . ': ' . $reader->value."\n"; // xmlns:pfx: urn::pfx
26
![Page 27: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/27.jpg)
XMLReader Properties
• name
• localName
• nodeType
• hasValue
• value
• hasAttributes
• attributeCount
• depth
• prefix
• namespaceURI
• baseURI
• isDefault
• isEmptyElement
• xmlLang
27
![Page 28: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/28.jpg)
Basic Parser Configuration
• XMLReader::LOADDTD
• XMLReader::DEFAULTATTRS
• XMLReader::VALIDATE
• XMLReader::SUBST_ENTITIES
$reader = newXMLReader();
$reader->open($file);
$reader->setParserProperty(XMLReader::LOADDTD, TRUE);
$reader->setParserProperty(XMLReader::VALIDATE, TRUE);
var_dump($reader->getParserProperty(XMLReader::VALIDATE));
28
![Page 29: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/29.jpg)
Advanced Parser Configuration
• Leverages ext/libxml parser constants
• Provides advanced parsing capabilities to XMLReader
$reader = new XMLReader();
$reader->XML($xml, NULL,
LIBXML_NOCDATA | LIBXML_DTDVALID | LIBXML_XINCLUDE);
echo $reader->nodeType."\n";
while ($reader->read()) {
echo $reader->name."\n";
}
29
![Page 30: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/30.jpg)
DTD Validation
<!DOCTYPE chapter [ <!ELEMENT chapter (title, para)> <!ELEMENT title (#PCDATA)> <!ELEMENT para (#PCDATA)>]> <chapter> <title>XMLReader</title> </chapter>
$reader->XML($xml, NULL, LIBXML_DTDVALID | LIBXML_NOERROR);while ($reader->read()) { echo $reader->name . ': ' . $reader->value."\n"; if (! $reader->isValid()) { echo libxml_get_last_error()->message; break; }}chapter: Element chapter content does not follow the DTD, expecting (title , para), got (title )
30
![Page 31: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/31.jpg)
RelaxNG Validation
XML Source<chapter> <title>XMLReader</title> <test/></chapter>
RelaxNG Source<element name="chapter" xmlns="http://relaxng.org/ns/structure/1.0"> <element name="title"><text/></element> <element name="para"><text/></element></element>
31
![Page 32: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/32.jpg)
RelaxNG Validation
$reader = new XMLReader();libxml_use_internal_errors(true);$reader->XML($xml);$reader->setRelaxNGSchemaSource($rng);
while ($reader->read()) { if (! $reader->isValid()) { echo $reader->name . ': ' . $reader->value."\n"; echo libxml_get_last_error()->message; break; }}
test: Did not expect element test there
32
![Page 33: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/33.jpg)
XML Schema Validation
<chapter> <title>XMLReader</title> <test/></chapter>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="chapter"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" minOccurs="1"> <xsd:complexType> <xsd:sequence> <xsd:element name="title" minOccurs="1" type="xsd:string"/> <xsd:element name="para" minOccurs="1" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>
33
![Page 34: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/34.jpg)
XML Schema Validation
$reader = new XMLReader();libxml_use_internal_errors(true);$reader->XML($xml);$reader->setSchema('schema.xsd');
while ($reader->read()) { if (! $reader->isValid()) { echo $reader->name . ': ' . $reader->value."\n"; echo libxml_get_last_error()->message; break; }}
chapter: Element 'test': This element is not expected.
34
![Page 35: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/35.jpg)
Exporting Nodes
<movie> <title>PHP: Behind the Parser</title> <character> <name>Ms. Coder</name> </character></movie>
while($reader->read()) { if ($reader->name == 'title') { $node = $reader->expand(); $dom = new DOMDocument(); $node = $dom->importNode($node, true); print $dom->saveXML($node); break; }}
<title>PHP: Behind the Parser</title>
35
![Page 36: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/36.jpg)
XMLWriter
• Lightweight, forward-only API for generating well formed XML– Automatically escapes data
– Writes to memory or directly to streams
– Ability to control indenting
– Enforces wellformedness by automatically closing open tags
36
![Page 37: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/37.jpg)
Creating The Document
$writer = new XMLWriter(); $writer->openMemory();
$writer->setIndent(true); $writer->setIndentString("\t"); $writer->startDocument('1.0', 'UTF-8');
$writer->startElement('results');
echo $writer->flush(false);
<?xml version="1.0" encoding="UTF-8"?><results
37
![Page 38: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/38.jpg)
Writing Content
$writer->startElement('result');$writer->writeAttribute("id", "123");$writer->writeElement('name', 'John & Jane');$writer->startElement('lastName');$writer->text('Doe');$writer->endElement();
echo $writer->flush()
<?xml version="1.0" encoding="UTF-8"?><results> <result id="123"> <name>John & Jane</name> <lastName>Doe</lastName>
38
![Page 39: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/39.jpg)
Completing The Document
$writer->endElement();$writer->startElement('result');$writer->writeAttribute("id", "456");$writer->startElement('name');$writer->writeRaw('Joe & Mary');$writer->endElement();$writer->writeElement('lastName', 'Smith');$writer->endDocument();echo $writer->flush()."\n";
</result> <result id="456"> <name>Joe & Mary</name> <lastName>Smith</lastName> </result></results>
39
Close off all open tags
Add raw content
![Page 40: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/40.jpg)
Writing To Streams
• Requires less resources when outputting XML– Faster web service response time
– Less server load
– Write directly to php://output
– Write to custom stream wrappers
– Automatic buffer flushing as needed
40
![Page 41: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/41.jpg)
Writing To Streams
$data = array(array('name' => 'Dick & Jane', 'number' =>123),array('name' => 'John & Mary', 'number' => 456));
$writer = new XMLWriter(); $writer->openURI('php://output');$writer->setIndent(true);
$writer->startElement('results');foreach ($data AS $record) { $writer->startElement('result'); foreach ($record AS $key => $value) { $writer->writeElement($key, $value); } $writer->endElement(); $writer->flush();}
$writer->endDocument();unset($writer);
41
![Page 42: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/42.jpg)
Writing To Streams
<results> <result> <name>Dick & Jane</name> <number>123</number> </result> <result> <name>John & Mary</name> <number>456</number> </result></results>
42
![Page 43: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/43.jpg)
Namespaces: Brute Force
$writer = new XMLWriter(); $writer->openMemory();$writer->setIndent(true);
$writer->startElement('pfx:root');$writer->writeAttribute('xmlns:pfx', 'urn::mypfx');$writer->writeElement('pfx:child', 'mydata');
$writer->endDocument();echo $writer->flush();
<pfx:root xmlns:pfx="urn::mypfx"> <pfx:child>mydata</pfx:child></pfx:root>
43
![Page 44: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/44.jpg)
Namespaces
$writer = new XMLWriter(); $writer->openMemory();$writer->setIndent(true);
$writer->startElementNS('pfx', 'root', 'urn:mypfx');$writer->writeElementNS('pfx', 'child', 'urn:mypfx', 'mydata');
$writer->endDocument();echo $writer->flush();
<pfx:root xmlns:pfx="urn:mypfx"> <pfx:child xmlns:pfx="urn:mypfx">mydata</pfx:child></pfx:root>
44
Namespace Declaration Is Repeated
![Page 45: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/45.jpg)
Streaming XML
Rob Richards
http://www.cdatazone.orghttp://xri.net/=rob.richards
![Page 46: Streaming XML - cdatazone.orgcdatazone.org/talks/phptek_2008/Streaming_XML.pdf · Parsing XML • Push Parser –Parser scans document and emits events to execute caller’s callbacks](https://reader036.vdocuments.us/reader036/viewer/2022071212/602615623d8b481e435910de/html5/thumbnails/46.jpg)
We Are Hiring PHP & AJAX Developers Contact us: [email protected]
OPEN TO ALL We want to meet you! Please join us for complimentary pizza
and beer (or your drink of choice)
Sheraton Gateway Suites O'Hare 11th floor
Thursday, May 22nd 5:30 - 7:30pm