php.query
php.query copied to clipboard
A library to parse and create XML documents in an easy and intuitive way.
PHPQuery
A library to manipulate and parse DOM documents in an easy and intuitive way. This library was inspired by the jQuery library and borrows some interesting ideas, like chaining.
Installation
Download the project:
git clone https://github.com/soloproyectos/phpquery
and copy the classes folder in your preferred location (optionally, rename it). Finally, copy and paste the following PHP code:
require_once "< YOUR PREFERRED LOCATION >/classes/autoload.php";
use com\soloproyectos\common\dom\node\DomNode;
And that's all. You are ready to use this library.
Methods
Create nodes from a given source:
DomNode::createFromElement($element): creates an instance from a DOMElement objectDomNode::createFromNode($node): creates an instance from a DomNode objectDomNode::createFromString($string): creates an instance from a string
Basic methods:
DomNode::document(): gets the internal DOMDocument instanceDomNode::elements(): gets internal DOM elementsDomNode::name(): gets the node nameDomNode::parent(): gets the parent node or anullvalueDomNode::root(): gets the root nodeDomNode::query($cssSelectors): finds nodes using CSS selectorsDomNode::xpath($expression): finds nodes using XPath expressionsDomNode::remove(): removes the node from the documentDomNode::clear(): removes all child nodesDomNode::data($name, [$value]): gets or sets arbitrary dataDomNode::append($string): appends inner XML textDomNode::prepend($string): prepends inner XML textDomNode::html([$string]): gets or sets inner XML textDomNode::text([$string]): gets or sets inner text
Attributes:
DomNode::attr($name, [$value]): gets or sets an attributeDomNode::hasAttr($name): checks if a node has an attribute
CSS attributes:
DomNode::css($name, [$value]): gets or sets a CSS attributeDomNode::hasCss($name): checks if a node has a CSS attribute
Classes:
DomNode::addClass($className): adds a class to the nodeDomNode::hasClass($className): checks if a node has a classDomNode::removeClass($className): removes a class from the node
Basic Examples
Create instances
Create a simple node:
// creates a simple node with two attributes and inner text
$item = new DomNode("item", array("id" => 101, "title" => "Title 101"), "Inner text here...");
echo $item;
Create a complex node:
// in this case we use a callback function to add complex structures into the node
$root = new DomNode("root", function ($target) {
// adds three subnodes
for ($i = 0; $i < 3; $i++) {
$target->append(new DomNode("item", array("id" => $i, "title" => "Title $i"), "This is the item $i"));
}
// appends some XML code
$target->append("<text>This text is added to the end.</text>");
// prepends some XML code
$target->prepend("<text>This text is added to the beginning</text>");
});
echo $root;
Create instances from a given source:
// creates an instance from a string
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// creates an instance from a given DOMElement
$doc = new DOMDocument("1.0", "UTF-8");
$doc->loadXML('<root><item id="101" /><item id="102" /><item id="103" /></root>');
$xml = DomNode::createFromElement($doc->documentElement);
Use the query method
You can use the same query function to retrieve either single or multiple nodes.
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// selects and prints all items
$items = $xml->query("item");
foreach ($items as $item) {
echo $item . "\n";
}
// select and prints a single item
$item = $xml->query("item[id = 102]");
echo $item;
Use the attr, text and html methods:
$xml = DomNode::createFromString(file_get_contents("test.xml"));
// prints books info
$books = $xml->query("books item");
foreach ($books as $book) {
echo "Title: " . $book->attr("title") . "\n";
echo "Author: " . $book->attr("author_id") . "\n";
echo "ISBN: " . $book->query("isbn")->text() . "\n";
echo "Available: " . $book->query("available")->text() . "\n";
echo "Description: " . $book->query("description")->text() . "\n";
echo "---\n";
}
// gets the number of items
echo "Number of items: " . count($books);
// prints inner XML text
$genres = $xml->query("genres");
echo $genres->html();
Use the attr, text and html methods to change contents:
In the previous example we used attr, text and html for getting contents. In this example we are use the same methods to change the document.
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// changes or adds attributes and inner texts
$item = $xml->query("item[id = 102]");
$item->attr("id", 666);
$item->attr("title", "Item 666");
$item->text("I'm an inner text");
echo $item;
// changes inner contents
$item = $xml->query("item[id = 103]");
$item->html('<subitem>I am a subitem</subitem>');
echo $item;
Use prepend and append methods:
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// appends contents
$item = $xml->query("item[id = 102]");
$item->append('<subitem id="102.1" title="Subitem title">This text goes to the end...</subitem>');
echo $xml;
// appends a DomNode object
$item->append(new DomNode("subitem", array("id" => "102.1", "title" => "Subitem title"), "Some inner text here ..."));
echo $xml;
// appends a DomNode object and calls the `callback` function
$item->prepend(new DomNode("subitem", array("id" => "102.2", "title" => "Subitem title"), function ($target) {
$target->text("I'm the first child node ...");
}));
echo $xml;
Use the remove and clear methods:
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// removes a single item
$item = $xml->query("item[id = 103]");
$item->remove();
echo $xml;
// removes a list of items
$items = $xml->query("item:even");
$items->remove();
echo $xml;
// removes all chid nodes
$xml->clear();
echo $xml;
Chaining
You can concatenate multiple methods in the same line:
$xml = DomNode::createFromString('<root><item id="101" /><item id="102" /><item id="103" /></root>');
// changes and prints the node in the same line
echo $xml->query("item[id = 102]")->attr("title", "Item 102")->text("Some text...")->append("<subitem />");