DOM XML (PHP 4) Функции
Устаревшие функции
Довольно много функций в расширении не вписываются в стандарт DOM и не будут в дальнейшем использоваться. Эти функции представлены в приведенном ниже списке. Функция DomNode_append_child() изменила свое поведение. Теперь она добавляет только сына узла и не добавляет брата. Если это поведение неприемлемо для вашего приложения, используйте не-DOM функцию DomNode_append_sibling().
Устаревшая функция | Новая функция |
---|---|
xmldoc | domxml_open_mem() |
xmldocfile | domxml_open_file() |
domxml_new_xmldoc | domxml_new_doc() |
domxml_dump_mem | DomDocument_dump_mem() |
domxml_dump_mem_file | DomDocument_dump_file() |
DomDocument_dump_mem_file | DomDocument_dump_file() |
DomDocument_add_root | DomDocument_create_element() followed by DomNode_append_child() |
DomDocument_dtd | DomDocument_doctype() |
DomDocument_root | DomDocument_document_element() |
DomDocument_children | DomNode_child_nodes() |
DomDocument_imported_node | No replacement. |
DomNode_add_child | Создает новый узел, например функцией DomDocument_create_element(), и добавляет его функцией DomNode_append_child(). |
DomNode_children | DomNode_child_nodes() |
DomNode_parent | DomNode_parent_node() |
DomNode_new_child | Создает новый узел, например функцией DomDocument_create_element(), и добавляет его функцией DomNode_append_child(). |
DomNode_set_content | Создает новый узел, например функцией DomDocument_create_text_node(), и добавляет его функцией DomNode_append_child(). |
DomNode_get_content | Контент - это просто текстовый узел, доступ к которому можно получить посредством DomNode_child_nodes(). |
DomNode_set_content | Контент - это просто текстовый узел, который можно добавить посредством DomNode_append_child(). |
Классы
API этого модуля соответствует стандарту DOM Level 2 настолько, насколько это возможно. В частности, API полностью объектно-ориентированный. Было бы неплохой идеей иметь под рукой стандарт DOM при работе с этим модулем. Несмотря на то, что API объектно-ориентирован, есть множество функций, которые могут вызываться в процедурном стиле посредством передачи объекта обработки первым аргументом функции. Эти функции предназначены для сохранения совместимости со старыми версиями расширения и не должны применяться в новых создаваемых скриптах.
Этот API отличается от официального DOM API по двум направлениям. Во-первых, все свойства класса представлены в виде одноименных функций. Во-вторых, имена функций соответствуют правилам именования функций в PHP. Это означает, что DOM-функция lastChild() будет записана как last_child().
В модуле определены классы, которые приведены в списке ниже, включая свои методы. Классы, являющиеся аналогом классов в стандарте DOM, имеют название вида DOMxxx.
Имя класса | Родительские классы |
---|---|
DomAttribute | DomNode |
DomCData | DomNode |
DomComment | DomCData : DomNode |
DomDocument | DomNode |
DomDocumentType | DomNode |
DomElement | DomNode |
DomEntity | DomNode |
DomEntityReference | DomNode |
DomProcessingInstruction | DomNode |
DomText | DomCData : DomNode |
Parser | На данный момент все еще именуется, как DomParser |
XPathContext |
Имя метода | Имя функции | Замечание |
---|---|---|
doctype | DomDocument_doctype() | |
document_element | DomDocument_document_element() | |
create_element | DomDocument_create_element() | |
create_text_node | DomDocument_create_text_node() | |
create_comment | DomDocument_create_comment() | |
create_cdata_section | DomDocument_create_cdata_section() | |
create_processing_instruction | DomDocument_create_processing_instruction() | |
create_attribute | DomDocument_create_attribute() | |
create_entity_reference | DomDocument_create_entity_reference() | |
get_elements_by_tagname | DomDocument_get_elements_by_tagname() | |
get_element_by_id | DomDocument_get_element_by_id() | |
dump_mem | DomDocument_dump_mem() | отсутствует в стандарте DOM |
dump_file | DomDocument_dump_file() | отсутствует в стандарте DOM |
html_dump_mem | DomDocument_html_dump_mem() | отсутствует в стандарте DOM |
xpath_init | xpath_init | отсутствует в стандарте DOM |
xpath_new_context | xpath_new_context | отсутствует в стандарте DOM |
xptr_new_context | xptr_new_context | отсутствует в стандарте DOM |
Имя метода | Имя функции | Замечание |
---|---|---|
tagname | DomElement_tagname() | |
get_attribute | DomElement_get_attribute() | |
set_attribute | DomElement_set_attribute() | |
remove_attribute | DomElement_remove_attribute() | |
get_attribute_node | DomElement_get_attribute_node() | |
set_attribute_node | DomElement_set_attribute_node() | |
get_elements_by_tagname | DomElement_get_elements_by_tagname() | |
has_attribute | DomElement_has_attribute() |
Имя метода | Замечание |
---|---|
DomNode_node_name() | |
DomNode_node_value() | |
DomNode_node_type() | |
DomNode_last_child() | |
DomNode_first_child() | |
DomNode_child_nodes() | |
DomNode_previous_sibling() | |
DomNode_next_sibling() | |
DomNode_parent_node() | |
DomNode_owner_document() | |
DomNode_insert_before() | |
DomNode_append_child() | |
DomNode_append_sibling() | Отсутствует в стандарте DOM. Эта функция эмулирует поведение DomNode_append_child(), касающееся создания узла. |
DomNode_remove_child() | |
DomNode_has_child_nodes() | |
DomNode_has_attributes() | |
DomNode_clone_node() | |
DomNode_attributes() | |
DomNode_unlink_node() | Отсутствует в стандарте DOM |
DomNode_replace_node() | Отсутствует в стандарте DOM |
DomNode_set_content() | Отсутствует в стандарте DOM, устарела |
DomNode_get_content() | Отсутствует в стандарте DOM, устарела |
DomNode_dump_node() | Отсутствует в стандарте DOM |
DomNode_is_blank_node() | Отсутствует в стандарте DOM |
Имя метода | Замечание | |
---|---|---|
name | DomAttribute_name() | |
value | DomAttribute_value() | |
specified | DomAttribute_specified() |
Имя метода | Имя функции | Замечание |
---|---|---|
target | DomProcessingInstruction_target() | |
data | DomProcessingInstruction_data() |
Имя метода | Имя функции | Замечание |
---|---|---|
add_chunk | Parser_add_chunk() | |
end | Parser_end() |
Имя метода | Имя функции | Замечание |
---|---|---|
eval | XPathContext_eval() | |
eval_expression | XPathContext_eval_expression() | |
register_ns | XPathContext_register_ns() |
Имя метода | Имя функции | Замечание |
---|---|---|
name | DomDocumentType_name() | |
entities | DomDocumentType_entities() | |
notations | DomDocumentType_notations() | |
public_id | DomDocumentType_public_id() | |
system_id | DomDocumentType_system_id() | |
internal_subset | DomDocumentType_internal_subset() |
Класс DomDtd исключен из DomNode. DomComment исключен из DomCData.
Примеры
Многие примеры в этом разделе требуют наличия строки XML. Вместо повторения этой строки в каждом примере, она помещена в файл, который будет добавляться в примерах. Содержимое этого файла приведено ниже в подразделе примеров. С другой стороны, ничего не мешает вам создать собственный XML документ и прочитать его функцией DomDocument_open_file().
Пример #1 Включаемый файл example.inc c XML-строкой
<?php
$xmlstr = "<?xml version='1.0' standalone='yes'?>
<!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd'
[ <!ENTITY sp \"spanish\">
]>
<!-- lsfj -->
<chapter language='en'><title language='en'>Title</title>
<para language='ge'>
&sp;
<!-- comment -->
<informaltable ID='findme' language='&sp;'>
<tgroup cols='3'>
<tbody>
<row><entry>a1</entry><entry
morerows='1'>b1</entry><entry>c1</entry></row>
<row><entry>a2</entry><entry>c2</entry></row>
<row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
</tbody>
</tgroup>
</informaltable>
</para>
</chapter>";
?>
Содержание
- DomAttribute::name — Returns the name of attribute
- DomAttribute::set_value — Sets the value of an attribute
- DomAttribute::specified — Checks if attribute is specified
- DomAttribute::value — Returns value of attribute
- DomDocument::add_root — Adds a root node [deprecated]
- DomDocument::create_attribute — Create new attribute
- DomDocument::create_cdata_section — Create new cdata node
- DomDocument::create_comment — Create new comment node
- DomDocument::create_element_ns — Create new element node with an associated namespace
- DomDocument::create_element — Create new element node
- DomDocument::create_entity_reference — Create an entity reference
- DomDocument::create_processing_instruction — Creates new PI node
- DomDocument::create_text_node — Create new text node
- DomDocument::doctype — Returns the document type
- DomDocument::document_element — Returns root element node
- DomDocument::dump_file — Dumps the internal XML tree back into a file
- DomDocument::dump_mem — Dumps the internal XML tree back into a string
- DomDocument::get_element_by_id — Searches for an element with a certain id
- DomDocument::get_elements_by_tagname — Returns array with nodes with given tagname in document or empty array, if not found
- DomDocument::html_dump_mem — Dumps the internal XML tree back into a string as HTML
- DomDocument::xinclude — Substitutes XIncludes in a DomDocument Object
- DomDocumentType::entities — Returns list of entities
- DomDocumentType::internal_subset — Returns internal subset
- DomDocumentType::name — Returns name of document type
- DomDocumentType::notations — Returns list of notations
- DomDocumentType::public_id — Returns public id of document type
- DomDocumentType::system_id — Returns the system id of document type
- DomElement::get_attribute_node — Returns the node of the given attribute
- DomElement::get_attribute — Returns the value of the given attribute
- DomElement::get_elements_by_tagname — Gets elements by tagname
- DomElement::has_attribute — Checks to see if an attribute exists in the current node
- DomElement::remove_attribute — Removes attribute
- DomElement::set_attribute_node — Adds new attribute
- DomElement::set_attribute — Sets the value of an attribute
- DomElement::tagname — Returns the name of the current element
- DomNode::add_namespace — Adds a namespace declaration to a node
- DomNode::append_child — Adds a new child at the end of the children
- DomNode::append_sibling — Adds new sibling to a node
- DomNode::attributes — Returns list of attributes
- DomNode::child_nodes — Returns children of node
- DomNode::clone_node — Clones a node
- DomNode::dump_node — Dumps a single node
- DomNode::first_child — Returns first child of node
- DomNode::get_content — Gets content of node
- DomNode::has_attributes — Checks if node has attributes
- DomNode::has_child_nodes — Checks if node has children
- DomNode::insert_before — Inserts new node as child
- DomNode::is_blank_node — Checks if node is blank
- DomNode::last_child — Returns last child of node
- DomNode::next_sibling — Returns the next sibling of node
- DomNode::node_name — Returns name of node
- DomNode::node_type — Returns type of node
- DomNode::node_value — Returns value of a node
- DomNode::owner_document — Returns the document this node belongs to
- DomNode::parent_node — Returns the parent of the node
- DomNode::prefix — Returns name space prefix of node
- DomNode::previous_sibling — Returns the previous sibling of node
- DomNode::remove_child — Removes child from list of children
- DomNode::replace_child — Replaces a child
- DomNode::replace_node — Replaces node
- DomNode::set_content — Sets content of node
- DomNode::set_name — Sets name of node
- DomNode::set_namespace — Sets namespace of a node
- DomNode::unlink_node — Deletes node
- DomProcessingInstruction::data — Returns the data of ProcessingInstruction node
- DomProcessingInstruction::target — Returns the target of a ProcessingInstruction node
- DomXsltStylesheet::process — Applies the XSLT-Transformation on a DomDocument Object
- DomXsltStylesheet::result_dump_file — Dumps the result from a XSLT-Transformation into a file
- DomXsltStylesheet::result_dump_mem — Dumps the result from a XSLT-Transformation back into a string
- domxml_new_doc — Создает новый пустой XML документ
- domxml_open_file — Создает объект DOM из XML файла
- domxml_open_mem — Создает объект DOM XML документа
- domxml_version — Получает номер версии XML библиотеки
- domxml_xmltree — Создает дерево объектов PHP из XML документа
- domxml_xslt_stylesheet_doc — Создает объект класса DomXsltStylesheet из объекта DomDocument
- domxml_xslt_stylesheet_file — Создает объект DomXsltStylesheet из XML файла
- domxml_xslt_stylesheet — Создает объект DomXsltStylesheet из строки XSL
- domxml_xslt_version — Получает версию XSLT библиотеки
- xpath_eval_expression — Вычисляет XPath Location Path в переданной строке
- xpath_eval — Вычисляет XPath Location Path в переданной строке
- xpath_new_context — Создает новый xpath контекст
- xpath_register_ns_auto — Регистрация заданного пространства имен в определенном XPath контексте
- xpath_register_ns — Регистрирует пространство имен в переданном XPath контексте
- xptr_eval — Вычисляет XPtr Location Path в заданной строке
- xptr_new_context — Создает новый контекст XPath
Коментарии
If you're having trouble understanding how the the DOM XML extension fits together you may find the UML diagram here helps: http://www.phppatterns.com/index.php/article/articleview/38
This recursive function will iterate over a DOM object and display it as a nicely formatted XML structure. I used intuitive variable names to help learn more about the DOM functions and their return values.
<<?php
function PrintDomTree($DomNode)
{
if ($ChildDomNode = $DomNode->first_child()) {
static $depth = 0;
$whitespace = "\n<br>".str_repeat(" ", ($depth * 2));
while ($ChildDomNode) {
if ($ChildDomNode->node_type() == XML_TEXT_NODE) {
echo trim($ChildDomNode->node_value());
} elseif ($ChildDomNode->node_type() == XML_ELEMENT_NODE) {
$HasTag = 1;
echo $whitespace;
echo "<", $ChildDomNode->node_name();
if ($ChildDomNode->has_attributes()) {
$Array = $ChildDomNode->attributes();
foreach ($Array AS $DomAttribute) {
echo " ", $DomAttribute->name(), "=\"", $DomAttribute->value(), "\"";
}
}
echo ">";
if ($ChildDomNode->has_child_nodes()) {
$depth++;
if (PrintDomTree($ChildDomNode)) {
echo $whitespace;
}
$depth--;
}
echo "</", $ChildDomNode->node_name(), ">";
}
$ChildDomNode = $ChildDomNode->next_sibling();
}
return $HasTag;
}
}
?>
Hey;
If you need to parse XML on an older version of PHP (e.g. 4.0) or if you can't get the expat extension enabled on your server, you might want to check out the Saxy and DOMIT! xml parsers from Engage Interactive. They're opensource and pure php, so no extensions or changes to your server are required. I've been using them for over a month on some projects with no problems whatsoever!
Check em out at:
DOMIT!, a DOM based xml parser, uses Saxy (included)
http://www.engageinteractive.com/redir.php?resource=3&target=domit
or
Saxy, a sax based xml parser
http://www.engageinteractive.com/redir.php?resource=4&target=saxy
Brad
You can always use a sax parser (expat) which saves on memory storage (there is none as sax is event driven) and use this neat code to produce an array structure of you xml file :
see http://fr2.php.net/manual/fr/function.xml-parse.php
comment by
tgrabietz at bupnet dot de
22-Sep-2004 05:05
I recently developed a script for parsing DHL XML transaction responses - finding it a pain in the rear to actually parse the XML and set my variables - it actually wasn't that hard once I figured it out - and it goes something like this...
<?php
// Use with a class containing functions set_attributes() and
// set_data(). Use the following to set variables from the
// resulting xml. $node is a dom xml object - in the first call
// to loop, $node would be equal to the root document
// element.
function loop($node) {
// set attribute tags here
if ($node->has_attributes()) {
$this->set_attributes($node);
} // end if node has attributes
if ($node->has_child_nodes()) {
$this->loop($node->first_child());
} // end if node has child
else {
$this->set_data($node);
} // end if node has no child
// get next sibling
$node = $node->next_sibling();
if ($node) {
$this->loop($node);
} // end if node
} // end function loop
?>
The code goes from the root element, if the element has attributes - it sets attribute variables. Second, it recursively proceeds to the lowest level element (no more children). Once that level has been reached, data variables are set. The next step goes to the next sibling of the element, if it exists. If the next sibling does not exists, the function is ended and the current element is returned to the parent element. The parent element is then checked for siblings. This process continues (as is with recursion) until the parent element is back at the root element, which is the end of the document.
If you are using apache, instead of copying files around (iconv.dll for instance) you can use this in your httpd.conf for apache:
LoadFile "d:/php/dlls/iconv.dll"
I placed this line before
LoadModule php4_module "d:/php/sapi/php4apache2.dll"
and it worked, no copying of files or anything therefore helps when updating php, don't have to mess around searching for files and other stuff.
Hi at All,
if you use xpath_eval() you get a xpathobject with a type-member-variable, which tells you about the type of the found content. Here are the values and the corresponding types:
1 = XPATH_NODESET (integer)
2 = XPATH_BOOLEAN (integer)
3 = XPATH_NUMBER (integer)
4 = XPATH_STRING (integer)
I think, but don't know, that the rest of the constants are:
0 = XPATH_UNDEFINED (integer)
5 = XPATH_POINT (integer)
6 = XPATH_RANGE (integer)
7 = XPATH_LOCATIONSET (integer)
I hope i could help some people.
Greetz,
Chris
The PHP 5.0 DOM is very powerful to create and work on valid RSS Feeds. I found a easy to follow step-by-step-tutorial here:
http://xml-rss.de/xml-rss-feed-mit-php.htm
(in german language but the code can be understand in every language i think) maybe it helps someone to understand the DOM-Thing better. But beware it don´t work on PHP 4!