# fluidxml
**Repository Path**: fiskerlee/fluidxml
## Basic Information
- **Project Name**: fluidxml
- **Description**: FluidXML, the PHP library for manipulating XML with a concise and fluent API.
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-03-30
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[apis]: https://github.com/servo-php/fluidxml/wiki/APIs
[gettingstarted]: https://github.com/servo-php/fluidxml/wiki/Getting-Started
[examples]: https://github.com/servo-php/fluidxml/blob/master/documents/Examples/
[specs]: https://github.com/servo-php/fluidxml/blob/master/specs/FluidXml.php
[wiki]: https://github.com/servo-php/fluidxml/wiki
[bsd]: https://opensource.org/licenses/BSD-2-Clause
[license]: https://github.com/servo-php/fluidxml/blob/master/documents/License.txt
[changelog]: https://github.com/servo-php/fluidxml/blob/master/documents/Changelog.txt
[codecoverage]: https://bytebucket.org/daniele_orlando/bithosting/raw/master/FluidXML_code_coverage.png
[donate-button]: https://bytebucket.org/daniele_orlando/bithosting/raw/master/Donate_button.png
[donate-link]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UUBXYHQRVJE28
[donate-link-alt]: https://www.paypal.me/danieleorlando
[ninja]: http://1.viki.io/d/1863c/8b75dc48c9.gif
[thankyou]: https://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/Heart_corazón.svg/2000px-Heart_corazón.svg.png
[packagist]: https://packagist.org/packages/servo/fluidxml
[travis]: https://travis-ci.org/servo-php/fluidxml
[scrutinizer]: https://scrutinizer-ci.com/g/servo-php/fluidxml/?branch=master
[coveralls]: https://coveralls.io/github/servo-php/fluidxml?branch=master
[codeclimate]: https://codeclimate.com/github/servo-php/fluidxml
[codeship]: https://codeship.com/projects/129206
[circle]: https://circleci.com/gh/servo-php/fluidxml
[packagist-license-badge]: https://poser.pugx.org/servo/fluidxml/license
[packagist-release-badge]: https://poser.pugx.org/servo/fluidxml/v/stable
[packagist-downloads-badge]: https://poser.pugx.org/servo/fluidxml/downloads
[packagist-license-badge-alt]: https://img.shields.io/packagist/l/servo/fluidxml.svg?style=flat-square
[packagist-release-badge-alt]: https://img.shields.io/packagist/v/servo/fluidxml.svg?style=flat-square
[packagist-downloads-badge-alt]: https://img.shields.io/packagist/dt/servo/fluidxml.svg?style=flat-square
[travis-build-badge]: https://travis-ci.org/servo-php/fluidxml.svg?branch=master
[scrutinizer-coverage-badge]: https://scrutinizer-ci.com/g/servo-php/fluidxml/badges/coverage.png?b=master
[scrutinizer-quality-badge]: https://scrutinizer-ci.com/g/servo-php/fluidxml/badges/quality-score.png?b=master
[coveralls-coverage-badge]: https://coveralls.io/repos/github/servo-php/fluidxml/badge.svg?branch=master
[codeclimate-quality-badge]: https://codeclimate.com/github/servo-php/fluidxml/badges/gpa.svg
[codeship-build-badge]: https://codeship.com/projects/8f977260-a359-0133-4946-1ac8bff03ae9/status?branch=master
[circle-build-badge]: https://circleci.com/gh/servo-php/fluidxml.svg?style=svg
[![Travis Build][travis-build-badge]][travis]
[![Coveralls Coverage][coveralls-coverage-badge]][coveralls]
[![Scrutinizer Quality][scrutinizer-quality-badge]][scrutinizer]
[![Code Climate Quality][codeclimate-quality-badge]][codeclimate]
[![Packagist License][packagist-license-badge]][packagist]
[![Packagist Last Release][packagist-release-badge]][packagist]
[![Packagist Total Downloads][packagist-downloads-badge]][packagist]
## Changelog
**1.20.3** (2016-07-12):
_fixes wrong handling of null/empty node value._
**...**
[The full changes list.][changelog]
# FluidXML
FluidXML is a PHP library designed to manipulate XML documents with a **concise** and **fluent** API.
It leverages the fluent programming pattern to be **fun and effective**.
```php
$book = fluidxml();
$book->add('title', 'The Theory Of Everything')
->add('author', 'S. Hawking')
->add('chapters', true)
->add('chapter', 'Ideas About The Universe', ['id' => 1])
->add('chapter', 'The Expanding Universe', ['id' => 2]);
```
Or, if you prefer, there is an **extended syntax**.
```php
$book = new FluidXml();
$book->addChild('title', 'The Theory Of Everything')
->addChild('author', 'S. Hawking')
->addChild('chapters', true)
->addChild('chapter', 'Ideas About The Universe', ['id' => 1])
->addChild('chapter', 'The Expanding Universe', ['id' => 2]);
```
With FluidXML the DOM manipulation becomes **fast**, **clear** and **expressive**.
**PHP Arrays** are first class citizens.
```php
$book->add([ 'title' => 'The Theory Of Everything',
'author' => 'S. Hawking',
'chapters' => [
[ 'chapter' => [
'@id' => '1',
'@' => 'Ideas About The Universe' ] ],
[ 'chapter' => [
'@id' => '2',
'@' => 'The Expanding Universe' ] ],
]]);
```
```php
echo $book;
```
```xml
The Theory Of Everything
S. Hawking
Ideas About The Universe
The Expanding Universe
```
**XPath** is king.
```php
$book->query('//title', '//author', '//chapter')
->attr('lang', 'en');
```
And **CSS Selectors** rock.
```php
$book->query('#id', '.class1.class2', 'div p > span')
->attr('lang', 'en');
// Many other selectors are available.
```
**XML/CSS Namespaces** are fully covered.
```php
$book->namespace('xhtml', 'http://www.w3.org/1999/xhtml')
->add('xhtml:h1')
->query('//xhtml:h1') // XPath namespace.
->query('xhtml|h1'); // CSS namespace.
```
And sometimes **XML Fragments** are the fastest way.
```php
$book->add(<<
XML
);
```
Everything is fluent, even **iterations**.
```php
$book->query('//chapter')
->each(function ($i) {
$this->attr('id', $i);
});
```
```php
$book->query('//chapters')
->times(3)
->add('chapter')
->times(4, function ($i) {
$this->add('chapter');
$this->add('illustration');
});
```
Whether some queries are too complex to express with XPath/CSS,
**filtering** is your friend.
```php
$book->query('//chapters')
->filter(function ($i, $node) {
return $i % 2 === 0;
})
->attr('even');
```
Interoperability with existing **DOMDocument** and **SimpleXML** is simply magic.
Import them or inject them in any point of the FluidXML flow just like that.
```php
fluidxml($domdocument)
->query('/html/body')
->add($simplexml);
// Yes, we merged a DOMDocument with a SimpleXMLElement
// and everything is still fluid.
```
Don't be shy and tell it: **« IT'S AWESOME! »** ^\_^
Many other [APIs][apis] are available:
- `__invoke()`
- `append()`/`appendSibling()`
- `prepend()`/`prependSibling()`
- `addText()`
- `text()`/`setText()`
- `addCdata()`
- `cdata()`/`setCdata()`
- `addComment()`
- `comment()`/`setComment()`
- `remove()`
- `size()`/`length()`
- `load()`
- `save()`
- `dom()`
- `xml()`
- `html()`
- `__toString()`
- `array()`
- ...
## Still doubts?
FluidXML is **fun** to use, **concise** and **effective**.
If it's not enough, it has a comprehensive test suite with a **100% code coverage**.
But you'll have the best answer trying it yourself.
![100% Code Coverage][codecoverage]
## Requirements
* PHP 5.6
## Installation
* **Cloning the repository**:
```sh
git clone https://github.com/servo-php/fluidxml.git
```
* **Using Composer**:
```sh
composer require servo/fluidxml
```
## Getting Started
* **Cloning the repository**:
```php
require_once 'FluidXml.php';
```
* **Using Composer**:
```php
require_once 'vendor/autoload.php';
```
`use` classes and functions as you need.
```php
use function \FluidXml\fluidxml;
use function \FluidXml\fluidns;
use function \FluidXml\fluidify;
```
```php
use \FluidXml\FluidXml;
use \FluidXml\FluidNamespace;
```
See the [documentation](#documentation) to get started and become a [ninja][ninja].
## Documentation
_10 minutes reading_
Follow the [Getting Started tutorial][gettingstarted] to become a [ninja][ninja] in no time.
Many other examples are available:
- inside the [`documents/Examples/`][examples] folder
- inside the [`specs/FluidXml.php`][specs] file (as test cases)
All them cover from the simplest case to the most complex scenario.
Take a look at the [APIs][apis] to discover all the available manipulation operations,
and go to the [Wiki Page][wiki] for more reading.
## Donation
If you think this code is **awesome** or if you want to demonstrate
your immense gratitude **[♥][thankyou]**, _buy me a coffe_.
[//]: # ([![Donate][donate-button]][donate-link]
)
[//]: # (**1$ or more**, due to the PayPal fees.)
## Roadmap
* [x] PHP 5.6 backport
* [ ] Extending the documentation
* [ ] Expanding the APIs
## Author
Daniele Orlando [<fluidxml@danieleorlando.com>](mailto:fluidxml@danieleorlando.com)
## License
FluidXML is licensed under the [BSD 2-Clause License][bsd].
See [`documents/License.txt`][license] for the details.