diff --git a/documents/Changelog.txt b/documents/Changelog.txt
index 0ec583e..2c1d4ae 100644
--- a/documents/Changelog.txt
+++ b/documents/Changelog.txt
@@ -1,7 +1,14 @@
[+]: new [~]: changed [-]: removed [#]: fixed [@]: internal
-1.20.2: (2016-03-04)
+1.20.3: (2016-07-12)
+fixes wrong handling of null/empty node value.
+
+ [#] Fixed:
+ * fixes #13.
+
+
+1.20.2:
fixes some leaked PHP notices.
[#] Fixed:
diff --git a/documents/ReadMe.md b/documents/ReadMe.md
index 9c90316..365037b 100644
--- a/documents/ReadMe.md
+++ b/documents/ReadMe.md
@@ -48,8 +48,8 @@
## Changelog
-**1.20.2** (2016-03-04):
-_fixes some leaked PHP notices._
+**1.20.3** (2016-07-12):
+_fixes wrong handling of null/empty node value._
**...**
@@ -57,8 +57,9 @@ _fixes some leaked PHP notices._
-[![Donate][donate-button]][donate-link]
-**1$ or more**, due to the PayPal fees.
+
+
+
# FluidXML
@@ -69,8 +70,6 @@ _fixes some leaked PHP notices._
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**.
-With FluidXML the DOM manipulation becomes **fast**, **clear** and **expressive**.
-
```php
$book = fluidxml();
@@ -93,6 +92,8 @@ $book->addChild('title', 'The Theory Of Everything')
->addChild('chapter', 'The Expanding Universe', ['id' => 2]);
```
+With FluidXML the DOM manipulation becomes **fast**, **clear** and **expressive**.
+
**PHP Arrays** are first class citizens.
```php
@@ -131,11 +132,13 @@ $book->query('//title', '//author', '//chapter')
->attr('lang', 'en');
```
-And **CSS Selectors** rocks.
+And **CSS Selectors** rock.
```php
-$book->query('title', 'author', 'chapters > chapter')
+$book->query('#id', '.class1.class2', 'div p > span')
->attr('lang', 'en');
+
+// Many other selectors are available.
```
**XML/CSS Namespaces** are fully covered.
@@ -147,7 +150,7 @@ $book->namespace('xhtml', 'http://www.w3.org/1999/xhtml')
->query('xhtml|h1'); // CSS namespace.
```
-And sometimes **string fragments** are the fastest way.
+And sometimes **XML Fragments** are the fastest way.
```php
$book->add(<<query('//chapter')
- ->each(function($i) {
+ ->each(function ($i) {
$this->attr('id', $i);
});
```
@@ -174,7 +177,7 @@ $book->query('//chapter')
$book->query('//chapters')
->times(3)
->add('chapter')
- ->times(4, function($i) {
+ ->times(4, function ($i) {
$this->add('chapter');
$this->add('illustration');
});
@@ -185,7 +188,7 @@ Whether some queries are too complex to express with XPath/CSS,
```php
$book->query('//chapters')
- ->filter(function($i, $node) {
+ ->filter(function ($i, $node) {
return $i % 2 === 0;
})
->attr('even');
@@ -293,21 +296,25 @@ 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]**, donate _1cent_.
+your immense gratitude **[♥][thankyou]**, _buy me a coffe_.
+
+
+
+
+
+[//]: # ([![Donate][donate-button]][donate-link]
)
+[//]: # (**1$ or more**, due to the PayPal fees.)
+
+
+
+
-[![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)
diff --git a/source/FluidXml/FluidHelper.php b/source/FluidXml/FluidHelper.php
index b7986ed..53edb69 100644
--- a/source/FluidXml/FluidHelper.php
+++ b/source/FluidXml/FluidHelper.php
@@ -10,7 +10,7 @@ public static function isAnXmlString($string)
// otherwise the first character check may fail.
$string = \ltrim($string);
- return $string[0] === '<';
+ return $string && $string[0] === '<';
}
public static function exportNode(\DOMDocument $dom, \DOMNode $node, $html = false)
diff --git a/source/FluidXml/FluidInsertionHandler.php b/source/FluidXml/FluidInsertionHandler.php
index ec82f77..efffef4 100644
--- a/source/FluidXml/FluidInsertionHandler.php
+++ b/source/FluidXml/FluidInsertionHandler.php
@@ -109,7 +109,7 @@ protected function recognizeStringMixed($k, $v)
return 'insertSpecialAttribute';
}
- if (\is_string($v)) {
+ if (\is_string($v) || $v === null) {
if (! FluidHelper::isAnXmlString($v)) {
return 'insertStringSimple';
}
diff --git a/specs/FluidXml.php b/specs/FluidXml.php
index 2f708c5..d558bf3 100644
--- a/specs/FluidXml.php
+++ b/specs/FluidXml.php
@@ -953,43 +953,229 @@ function addchild($parent, $i)
assert_is_fluid('addChild', 'a');
});
- it('should add a child', function () {
+ it('should add a child using the argument syntax', function () {
$xml = new FluidXml();
$xml->addChild('child1')
- ->addChild('child2')
->addChild('parent', true)
- ->addChild('child3')
- ->addChild('child4');
+ ->addChild('child2');
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1'])
+ ->addChild(['parent'], true)
+ ->addChild(['child2']);
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with a string value using the argument syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild('child1', 'value1')
+ ->addChild('parent', true)
+ ->addChild('child2', 'value2');
+
+ $expected = "\n"
+ . " value1\n"
+ . " \n"
+ . " value2\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with a string value using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1' => 'value1'])
+ ->addChild('parent', true)
+ ->addChild(['child2' => 'value2']);
+
+ $expected = "\n"
+ . " value1\n"
+ . " \n"
+ . " value2\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with an empty string value using the argument syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild('child1', '')
+ ->addChild('parent', true)
+ ->addChild('child2', '');
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with an empty string value using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1' => ''])
+ ->addChild('parent', true)
+ ->addChild(['child2' => '']);
$expected = "\n"
. " \n"
- . " \n"
. " \n"
- . " \n"
- . " \n"
+ . " \n"
. " \n"
. "";
assert_equal_xml($xml, $expected);
});
- it('should add many children', function () {
+ it('should add a child with a null value using the argument syntax', function () {
$xml = new FluidXml();
- $xml->addChild(['child1', 'child2'])
+ $xml->addChild('child1', null)
->addChild('parent', true)
- ->addChild(['child3', 'child4']);
+ ->addChild('child2', null);
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with a null value using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1' => null])
+ ->addChild('parent', true)
+ ->addChild(['child2' => null]);
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with an integer value using the argument syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild('child1', 1)
+ ->addChild('parent', true)
+ ->addChild('child2', 1);
+
+ $expected = "\n"
+ . " 1\n"
+ . " \n"
+ . " 1\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with an integer value using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1' => 1])
+ ->addChild('parent', true)
+ ->addChild(['child2' => 1]);
+
+ $expected = "\n"
+ . " 1\n"
+ . " \n"
+ . " 1\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with a 0 value using the argument syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild('child1', 0)
+ ->addChild('parent', true)
+ ->addChild('child2', 0);
+
+ $expected = "\n"
+ . " 0\n"
+ . " \n"
+ . " 0\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add a child with a 0 value using the array syntax', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1' => 0])
+ ->addChild('parent', true)
+ ->addChild(['child2' => 0]);
+
+ $expected = "\n"
+ . " 0\n"
+ . " \n"
+ . " 0\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add many children with and without a value', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child1', 'child2', 'child3' => 'value3', 'child4' => 'value4'])
+ ->addChild('parent', true)
+ ->addChild(['child5', 'child6', 'child7' => 'value7', 'child8' => 'value8']);
$expected = "\n"
. " \n"
. " \n"
+ . " value3\n"
+ . " value4\n"
. " \n"
- . " \n"
- . " \n"
+ . " \n"
+ . " \n"
+ . " value7\n"
+ . " value8\n"
. " \n"
. "";
assert_equal_xml($xml, $expected);
});
- it('should add many children recursively', function () {
+ it('should add many children of the same name with and without a value', function () {
+ $xml = new FluidXml();
+ $xml->addChild(['child', ['child'], ['child' => 'value1'], ['child' => 'value2']])
+ ->addChild('parent', true)
+ ->addChild(['child', ['child'], ['child' => 'value3'], ['child' => 'value4']]);
+
+ $expected = "\n"
+ . " \n"
+ . " \n"
+ . " value1\n"
+ . " value2\n"
+ . " \n"
+ . " \n"
+ . " \n"
+ . " value3\n"
+ . " value4\n"
+ . " \n"
+ . "";
+ assert_equal_xml($xml, $expected);
+ });
+
+ it('should add many children with nested arrays', function () {
$xml = new FluidXml();
$xml->addChild(['child1'=>['child11'=>['child111', 'child112'=>'value112'], 'child12'=>'value12'],
'child2'=>['child21', 'child22'=>['child221', 'child222']]])
@@ -1031,70 +1217,6 @@ function addchild($parent, $i)
EOF;
-
- assert_equal_xml($xml, $expected);
- });
-
- it('should add a child with a value, string and number', function () {
- $xml = new FluidXml();
- $xml->addChild(['child1' => 'value1'])
- ->addChild('child2', 'value2')
- ->addChild(['child3' => 3])
- ->addChild('child4', 4)
- ->addChild('parent', true)
- ->addChild(['child5' => 'value5'])
- ->addChild('child6', 'value6')
- ->addChild(['child7' => 7])
- ->addChild('child8', 8);
-
- $expected = "\n"
- . " value1\n"
- . " value2\n"
- . " 3\n"
- . " 4\n"
- . " \n"
- . " value5\n"
- . " value6\n"
- . " 7\n"
- . " 8\n"
- . " \n"
- . "";
- assert_equal_xml($xml, $expected);
- });
-
- it('should add many children with a value', function () {
- $xml = new FluidXml();
- $xml->addChild(['child1' => 'value1', 'child2' => 'value2'])
- ->addChild('parent', true)
- ->addChild(['child3' => 'value3', 'child4' => 'value4']);
-
- $expected = "\n"
- . " value1\n"
- . " value2\n"
- . " \n"
- . " value3\n"
- . " value4\n"
- . " \n"
- . "";
- assert_equal_xml($xml, $expected);
-
- $xml = new FluidXml();
- $xml->addChild([ 'child', ['child'], ['child' => 'value1'], ['child' => 'value2'] ])
- ->addChild('parent', true)
- ->addChild([ 'child', ['child'], ['child' => 'value3'], ['child' => 'value4'] ]);
-
- $expected = "\n"
- . " \n"
- . " \n"
- . " value1\n"
- . " value2\n"
- . " \n"
- . " \n"
- . " \n"
- . " value3\n"
- . " value4\n"
- . " \n"
- . "";
assert_equal_xml($xml, $expected);
});
@@ -2538,8 +2660,8 @@ function addchild($parent, $i)
it('should return the namespace mode', function () {
$ns_id = 'x';
$ns_uri = 'x.com';
- $ns_mode = FluidNamespace::MODE_EXPLICIT;
$ns = new FluidNamespace($ns_id, $ns_uri);
+ $ns_mode = FluidNamespace::MODE_EXPLICIT;
$actual = $ns->mode();
$expected = $ns_mode;
@@ -2767,6 +2889,5 @@ function addchild($parent, $i)
$expected = $hml->query('//span', '//div', '//p')->array();
\assert($actual === $expected, __($actual, $expected));
});
-
});
});