--- /dev/null
+Other node tree representations
+===============================
+
+It is possible to convert the AST into several textual representations, which serve different uses.
+
+Simple serialization
+--------------------
+
+It is possible to serialize the node tree using `serialize()` and also unserialize it using
+`unserialize()`. The output is not human readable and not easily processable from anything
+but PHP, but it is compact and generates quickly. The main application thus is in caching.
+
+Human readable dumping
+----------------------
+
+Furthermore it is possible to dump nodes into a human readable format using the `dump` method of
+`PhpParser\NodeDumper`. This can be used for debugging.
+
+```php
+$code = <<<'CODE'
+<?php
+
+function printLine($msg) {
+ echo $msg, "\n";
+}
+
+printLine('Hello World!!!');
+CODE;
+
+$parser = (new PhpParser\ParserFactory)->create(PhpParser\ParserFactory::PREFER_PHP7);
+$nodeDumper = new PhpParser\NodeDumper;
+
+try {
+ $stmts = $parser->parse($code);
+
+ echo $nodeDumper->dump($stmts), "\n";
+} catch (PhpParser\Error $e) {
+ echo 'Parse Error: ', $e->getMessage();
+}
+```
+
+The above script will have an output looking roughly like this:
+
+```
+array(
+ 0: Stmt_Function(
+ byRef: false
+ params: array(
+ 0: Param(
+ name: msg
+ default: null
+ type: null
+ byRef: false
+ )
+ )
+ stmts: array(
+ 0: Stmt_Echo(
+ exprs: array(
+ 0: Expr_Variable(
+ name: msg
+ )
+ 1: Scalar_String(
+ value:
+
+ )
+ )
+ )
+ )
+ name: printLine
+ )
+ 1: Expr_FuncCall(
+ name: Name(
+ parts: array(
+ 0: printLine
+ )
+ )
+ args: array(
+ 0: Arg(
+ value: Scalar_String(
+ value: Hello World!!!
+ )
+ byRef: false
+ )
+ )
+ )
+)
+```
+
+JSON encoding
+-------------
+
+Nodes (and comments) implement the `JsonSerializable` interface. As such, it is possible to JSON
+encode the AST directly using `json_encode()`:
+
+```php
+$code = <<<'CODE'
+<?php
+
+function printLine($msg) {
+ echo $msg, "\n";
+}
+
+printLine('Hello World!!!');
+CODE;
+
+$parser = (new PhpParser\ParserFactory)->create(PhpParser\ParserFactory::PREFER_PHP7);
+$nodeDumper = new PhpParser\NodeDumper;
+
+try {
+ $stmts = $parser->parse($code);
+
+ echo json_encode($stmts, JSON_PRETTY_PRINT), "\n";
+} catch (PhpParser\Error $e) {
+ echo 'Parse Error: ', $e->getMessage();
+}
+```
+
+This will result in the following output (which includes attributes):
+
+```json
+[
+ {
+ "nodeType": "Stmt_Function",
+ "byRef": false,
+ "name": "printLine",
+ "params": [
+ {
+ "nodeType": "Param",
+ "type": null,
+ "byRef": false,
+ "variadic": false,
+ "name": "msg",
+ "default": null,
+ "attributes": {
+ "startLine": 3,
+ "endLine": 3
+ }
+ }
+ ],
+ "returnType": null,
+ "stmts": [
+ {
+ "nodeType": "Stmt_Echo",
+ "exprs": [
+ {
+ "nodeType": "Expr_Variable",
+ "name": "msg",
+ "attributes": {
+ "startLine": 4,
+ "endLine": 4
+ }
+ },
+ {
+ "nodeType": "Scalar_String",
+ "value": "\n",
+ "attributes": {
+ "startLine": 4,
+ "endLine": 4,
+ "kind": 2
+ }
+ }
+ ],
+ "attributes": {
+ "startLine": 4,
+ "endLine": 4
+ }
+ }
+ ],
+ "attributes": {
+ "startLine": 3,
+ "endLine": 5
+ }
+ },
+ {
+ "nodeType": "Expr_FuncCall",
+ "name": {
+ "nodeType": "Name",
+ "parts": [
+ "printLine"
+ ],
+ "attributes": {
+ "startLine": 7,
+ "endLine": 7
+ }
+ },
+ "args": [
+ {
+ "nodeType": "Arg",
+ "value": {
+ "nodeType": "Scalar_String",
+ "value": "Hello World!!!",
+ "attributes": {
+ "startLine": 7,
+ "endLine": 7,
+ "kind": 1
+ }
+ },
+ "byRef": false,
+ "unpack": false,
+ "attributes": {
+ "startLine": 7,
+ "endLine": 7
+ }
+ }
+ ],
+ "attributes": {
+ "startLine": 7,
+ "endLine": 7
+ }
+ }
+]
+```
+
+There is currently no mechanism to convert JSON back into a node tree. Furthermore, not all ASTs
+can be JSON encoded. In particular, JSON only supports UTF-8 strings.
+
+Serialization to XML
+--------------------
+
+It is also possible to serialize the node tree to XML using `PhpParser\Serializer\XML->serialize()`
+and to unserialize it using `PhpParser\Unserializer\XML->unserialize()`. This is useful for
+interfacing with other languages and applications or for doing transformation using XSLT.
+
+```php
+<?php
+$code = <<<'CODE'
+<?php
+
+function printLine($msg) {
+ echo $msg, "\n";
+}
+
+printLine('Hello World!!!');
+CODE;
+
+$parser = (new PhpParser\ParserFactory)->create(PhpParser\ParserFactory::PREFER_PHP7);
+$serializer = new PhpParser\Serializer\XML;
+
+try {
+ $stmts = $parser->parse($code);
+
+ echo $serializer->serialize($stmts);
+} catch (PhpParser\Error $e) {
+ echo 'Parse Error: ', $e->getMessage();
+}
+```
+
+Produces:
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<AST xmlns:node="http://nikic.github.com/PHPParser/XML/node" xmlns:subNode="http://nikic.github.com/PHPParser/XML/subNode" xmlns:scalar="http://nikic.github.com/PHPParser/XML/scalar">
+ <scalar:array>
+ <node:Stmt_Function line="2">
+ <subNode:byRef>
+ <scalar:false/>
+ </subNode:byRef>
+ <subNode:params>
+ <scalar:array>
+ <node:Param line="2">
+ <subNode:name>
+ <scalar:string>msg</scalar:string>
+ </subNode:name>
+ <subNode:default>
+ <scalar:null/>
+ </subNode:default>
+ <subNode:type>
+ <scalar:null/>
+ </subNode:type>
+ <subNode:byRef>
+ <scalar:false/>
+ </subNode:byRef>
+ </node:Param>
+ </scalar:array>
+ </subNode:params>
+ <subNode:stmts>
+ <scalar:array>
+ <node:Stmt_Echo line="3">
+ <subNode:exprs>
+ <scalar:array>
+ <node:Expr_Variable line="3">
+ <subNode:name>
+ <scalar:string>msg</scalar:string>
+ </subNode:name>
+ </node:Expr_Variable>
+ <node:Scalar_String line="3">
+ <subNode:value>
+ <scalar:string>
+</scalar:string>
+ </subNode:value>
+ </node:Scalar_String>
+ </scalar:array>
+ </subNode:exprs>
+ </node:Stmt_Echo>
+ </scalar:array>
+ </subNode:stmts>
+ <subNode:name>
+ <scalar:string>printLine</scalar:string>
+ </subNode:name>
+ </node:Stmt_Function>
+ <node:Expr_FuncCall line="6">
+ <subNode:name>
+ <node:Name line="6">
+ <subNode:parts>
+ <scalar:array>
+ <scalar:string>printLine</scalar:string>
+ </scalar:array>
+ </subNode:parts>
+ </node:Name>
+ </subNode:name>
+ <subNode:args>
+ <scalar:array>
+ <node:Arg line="6">
+ <subNode:value>
+ <node:Scalar_String line="6">
+ <subNode:value>
+ <scalar:string>Hello World!!!</scalar:string>
+ </subNode:value>
+ </node:Scalar_String>
+ </subNode:value>
+ <subNode:byRef>
+ <scalar:false/>
+ </subNode:byRef>
+ </node:Arg>
+ </scalar:array>
+ </subNode:args>
+ </node:Expr_FuncCall>
+ </scalar:array>
+</AST>
+```
\ No newline at end of file