A small library to generate xml from source data
composer require alaa-almaliki/xml-data-mapper
see Example
To run the example run the command php main.php
There is one class to be extended:
code
// Check example folder to fully understand how it works // the class order represents xml mode which contains xml text node class Order extends \Xml\Data\Subject { protected $nodeName = 'order'; // the node name is name of the xml node that contains text nodes /** * add callbacks */ public function addCallbacks() { // you can manupilate the values presented in the xml $this->storage->registerCallback('first_name', function ($value) { return strtoupper($value); }); $this->storage->registerCallback('last_name', function ($value) { return strtoupper($value); }); } /** * @return array */ public function getMappedAttributes() { return [ 'order_number' => 'order_id', // The mapping is done as 'xml_attribute' => 'data_source_attribute' 'order_date' => 'created_at', 'customer_id' => 'customer_id', 'first_name' => 'customer_firstname', 'last_name' => 'customer_lastname', ]; } }Generating the XML
// Data source - where the keys are used for mapping - see class order above $data = [ 'order' => [ 'order_id' => '1', 'created_at' => '2018-03-04', 'customer_id' => '123', 'customer_firstname' => 'Alaa', 'customer_lastname' => 'Al-Maliki', 'shipping_address' => [ 'full_name' => 'Alaa Al-Maliki', 'street' => '123 Wightfield Road', 'city' => 'Manachester', 'country' => 'United Kingdom', 'postcode' => 'AB1 CD2' ], 'billing_address' => [ 'full_name' => 'John Doe', 'street' => '456 Crimson Avenue', 'city' => 'London', 'country' => 'United Kingdom', 'postcode' => 'BQ1 DF2' ], 'items' => [ [ 'item_id' => '1', 'qty' => 2, 'name' => 'Blue Jeans', 'sku' => 'BJ-123', 'tax_code' => 'UK1', 'total' => 12.98 ], [ 'item_id' => '2', 'qty' => 1, 'name' => 'Small T-shirt', 'sku' => 'SS-456', 'tax_code' => 'UK1', 'total' => 32.56 ] ], 'payment' => [ 'method' => 'by_card', 'amount_paid' => 45.54, ] ] ]; $order = new Order(new \Xml\Data\CallbackStorage()); // order node $order->setData($data['order']); $lines = []; foreach ($data['order']['items'] as $item) { $orderLine = new Line(new \Xml\Data\CallbackStorage()); // order line node $orderLine->setData($item); $lines[] = $orderLine; } $shippingAddress = new ShippingAddress(new \Xml\Data\CallbackStorage()); // shipping address node $shippingAddress->setData($data['order']['shipping_address']); $billingAddress = new BillingAddress(new \Xml\Data\CallbackStorage()); // billing address node $billingAddress->setData($data['order']['billing_address']); $payment = new Payment(new \Xml\Data\CallbackStorage()); // payment node $payment->setData($data['order']['payment']); $rootSubject = new RootSubject(new \Xml\Data\CallbackStorage()); // orders node - root $rootSubject->addSubject($order); // add order node to the root node which is named order $order->addSubjects($lines, 'lines'); // add lines nodes to the order node $order->addSubject($billingAddress); // add billing address node to the order node $order->addSubject($shippingAddress); // add shipping address node to the order node $order->addSubject($payment); // add payment node to the order node // generate the xml file \Xml\Data\Mapper::convert($rootSubject) ->toXml() ->addNamespace('xsi', "http://www.w3.org/1999/xhtml") ->addNamespace('xmlns', "http://www.w3.org/2000/10/XMLSchema") ->withOpenTag() ->write(__DIR__ . '/resource/order.xml'); vendor/bin/phpunit -c phpunit.xml.dist
Feel free to contribute if any bugs found or enhancements need to be done
MIT