It took me forever to find a mapping for the XML_*_NODE constants. So I thought, it'd be handy to paste it here:
1 XML_ELEMENT_NODE
2 XML_ATTRIBUTE_NODE
3 XML_TEXT_NODE
4 XML_CDATA_SECTION_NODE
5 XML_ENTITY_REFERENCE_NODE
6 XML_ENTITY_NODE
7 XML_PROCESSING_INSTRUCTION_NODE
8 XML_COMMENT_NODE
9 XML_DOCUMENT_NODE
10 XML_DOCUMENT_TYPE_NODE
11 XML_DOCUMENT_FRAGMENT_NODE
12 XML_NOTATION_NODEDOMNode
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
DOMNode
Референца за `class.domnode.php` со подобрена типографија и навигација.
Класата DOMNode
класата mysqli_driver
Синопсис на класата
bool
$exclusive = false,bool
$withComments = false,?array
$xpath = null,?array
$nsPrefixes = null): string|false
Претходно дефинирани константи
-
DOMNode::DOCUMENT_POSITION_DISCONNECTED - Поставено кога другиот јазол и референтниот јазол не се во исто дрво.
-
DOMNode::DOCUMENT_POSITION_PRECEDING - Поставено кога другиот јазол му претходи на референтниот јазол.
-
DOMNode::DOCUMENT_POSITION_FOLLOWING - Поставено кога другиот јазол го следи референтниот јазол.
-
DOMNode::DOCUMENT_POSITION_CONTAINS - Поставено кога другиот јазол е предок на референтниот јазол.
-
DOMNode::DOCUMENT_POSITION_CONTAINED_BY - Поставено кога другиот јазол е потомок на референтниот јазол.
-
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC - Поставено кога резултатот зависи од однесување специфично за имплементацијата и можеби не е пренослив. Ова може да се случи со исклучени јазли или со јазли на атрибути.
Својства
- nodeName
-
Враќа најточното име за тековниот тип на јазол
- nodeValue
-
Вредноста на овој јазол, во зависност од неговиот тип. Спротивно на спецификацијата на W3C, вредноста на јазолот на DOMElement јазлите е еднаква на DOMNode::textContent наместо
null. - nodeType
-
Ја добива типот на јазолот. Еден од претходно дефинираните
XML_*_NODEconstants - parentNode
-
Родителот на овој јазол. Ако нема таков јазол, ова враќа
null. - parentElement
-
Родителскиот елемент на овој елемент. Ако нема таков елемент, ова враќа
null. - childNodes
-
А DOMNodeList што ги содржи сите деца на овој јазол. Ако нема деца, ова е празно DOMNodeList.
- firstChild
-
Првото дете на овој јазол. Ако нема таков јазол, ова враќа
null. - lastChild
-
Последното дете на овој јазол. Ако нема таков јазол, ова враќа
null. - previousSibling
-
Јазолот што непосредно му претходи на овој јазол. Ако нема таков јазол, ова враќа
null. - nextSibling
-
Јазолот што непосредно го следи овој јазол. Ако нема таков јазол, ова враќа
null. - attributes
-
А DOMNamedNodeMap што ги содржи атрибутите на овој јазол (ако е DOMElementоператор за зголемување
nullotherwise. - isConnected
-
Дали јазолот е поврзан со документ
- ownerDocument
-
На DOMDocument објект поврзан со овој јазол, или
nullако овој јазол нема поврзан документ (на пр. ако е одвоен, или ако е DOMDocument). - namespaceURI
-
URI просторот за имиња на овој јазол, или
nullако не е специфициран. - prefix
-
префикс на просторот за имиња на овој јазол.
- localName
-
Враќа локален дел од квалификуваното име на овој јазол.
- baseURI
-
Апсолутна основна URI на овој јазол или
nullако имплементацијата не успеала да добие апсолутна URI. - textContent
-
Текстуална содржина на овој јазол и неговите потомци.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.4.0 | Метод Јазол за кој треба да се спореди позицијата, во однос на овој јазол. е додадена. |
| 8.4.0 |
Константи DOMNode::DOCUMENT_POSITION_DISCONNECTED,
DOMNode::DOCUMENT_POSITION_PRECEDING,
DOMNode::DOCUMENT_POSITION_FOLLOWING,
DOMNode::DOCUMENT_POSITION_CONTAINS,
DOMNode::DOCUMENT_POSITION_CONTAINED_BYПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
се додадени.
|
| 8.3.0 | Методи DOMNode::contains()Препорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во (PHP 8 >= 8.3.0) се додадени. |
| 8.3.0 | Својства DOMNode::$parentElementПрепорачаниот начин за избегнување на SQL инјекција е со врзување на сите податоци преку подготвени изрази. Користењето на параметризирани прашања не е доволно за целосно избегнување на SQL инјекција, но тоа е најлесниот и најбезбедниот начин за обезбедување влез во SQL изразите. Сите динамични литерали на податоци во DOMNode::$isConnected се додадени. |
| 8.0.0 | Неимплементирани методи Јазол за кој треба да се спореди позицијата, во однос на овој јазол., (PHP 8 >= 8.3.0), DOMNode::getFeature(), DOMNode::setUserData() and DOMNode::getUserData() се отстранети. |
Белешки
Забелешка:
DOM екстензијата користи UTF-8 кодирање. Користете mb_convert_encoding(), GNU Recode документацијата на вашата инсталација за детални инструкции за барања за прекодирање., или iconv() за ракување со други кодирања.
Содржина
- DOMNode::appendChild — Додава ново дете на крајот од децата
- DOMNode::C14N — Канонизирај јазли во стринг
- DOMNode::C14NFile — Канонизирај јазли во датотека
- DOMNode::cloneNode — Клонирај јазол
- DOMNode::compareDocumentPosition — Спореди ја позицијата на два јазли
- DOMNode::contains — Провери дали јазолот содржи друг јазол
- DOMNode::getLineNo — Земи број на линија за јазол
- DOMNode::getNodePath — Добива XPath за јазол
- DOMNode::getRootNode — Земи XPath за јазол
- DOMNode::hasAttributes — Земи корен јазол
- DOMNode::hasChildNodes — Проверува дали јазолот има атрибути
- DOMNode::insertBefore — Проверува дали јазолот има деца
- DOMNode::isDefaultNamespace — Додава ново дете пред референтен јазол
- DOMNode::isEqualNode — Проверува дали наведениот namespaceURI е стандарден namespace или не
- DOMNode::isSameNode — Проверува дека двата јазли се еднакви
- DOMNode::isSupported — Укажува дали двата јазли се истиот јазол
- DOMNode::lookupNamespaceURI — Проверува дали функцијата е поддржана за наведената верзија
- DOMNode::lookupPrefix — Ги добива URI-њата на namespace на јазолот врз основа на префиксот
- DOMNode::normalize — Ги добива префиксите на namespace на јазолот врз основа на URI-њата на namespace
- DOMNode::removeChild — Нормализира јазол
- DOMNode::replaceChild — Отстранува дете од листата на деца
- DOMNode::__sleep — Забранува серијализација освен ако методите за серијализација не се имплементирани во подкласа
- DOMNode::__wakeup — Забранува десеријализација освен ако методите за десеријализација не се имплементирани во подкласа
Белешки од корисници 13 белешки
You cannot simply overwrite $textContent, to replace the text content of a DOMNode, as the missing readonly flag suggests. Instead you have to do something like this:
<?php
$node->removeChild($node->firstChild);
$node->appendChild(new DOMText('new text content'));
?>
This example shows what happens:
<?php
$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
echo "Content 1: ".$node->textContent."\n";
$node->textContent = 'new content';
echo "Content 2: ".$node->textContent."\n";
$newText = new DOMText('new content');
$node->appendChild($newText);
echo "Content 3: ".$node->textContent."\n";
$node->removeChild($node->firstChild);
$node->appendChild($newText);
echo "Content 4: ".$node->textContent."\n";
?>
The output is:
Content 1: old content // starting content
Content 2: old content // trying to replace overwriting $node->textContent
Content 3: old contentnew content // simply appending the new text node
Content 4: new content // removing firstchild before appending the new text node
If you want to have a CDATA section, use this:
<?php
$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
$node->removeChild($node->firstChild);
$newText = $doc->createCDATASection('new cdata content');
$node->appendChild($newText);
echo "Content withCDATA: ".$doc->saveXML($node)."\n";
?>For clarification:
The assumingly 'discoverd' by previous posters and seemingly undocumented methods (.getElementsByTagName and .getAttribute) on this class (DOMNode) are in fact methods of the class DOMElement, which inherits from DOMNode.
See: http://www.php.net/manual/en/class.domelement.phpThis class has a getAttribute method.
Assume that a DOMNode object $ref contained an anchor taken out of a DOMNode List. Then
$url = $ref->getAttribute('href');
would isolate the url associated with the href part of the anchor.The issues around mixed content took me some experimentation to remember, so I thought I'd add this note to save others time.
When your markup is something like: <div><p>First text.</p><ul><li><p>First bullet</p></li></ul></div>, you'll get XML_ELEMENT_NODEs that are quite regular. The <div> has children <p> and <ul> and the nodeValue for both <p>s yields the text you expect.
But when your markup is more like <p>This is <b>bold</b> and this is <i>italic</i>.</p>, you realize that the nodeValue for XML_ELEMENT_NODEs is not reliable. In this case, you need to look at the <p>'s child nodes. For this example, the <p> has children: #text, <b>, #text, <i>, #text.
In this example, the nodeValue of <b> and <i> is the same as their #text children. But you could have markup like: <p>This <b>is bold and <i>bold italic</i></b>, you see?</p>. In this case, you need to look at the children of <b>, which will be #text, <i>, because the nodeValue of <b> will not be sufficient.
XML_TEXT_NODEs have no children and are always named '#text'. Depending on how whitespace is handled, your tree may have "empty" #text nodes as children of <body> and elsewhere.
Attributes are nodes, but I had forgotten that they are not in the tree expressed by childNodes. Walking the full tree using childNodes will not visit any attribute nodes.In response to: alastair dot dallas at gmail dot com about "#text" nodes.
"#text" nodes appear when there are spaces or new lines between end tag and next initial tag.
Eg "<data><age>10</age>[SPACES]<other>20</other>[SPACES]</data>"
"data" childNodes has 4 childs:
- age = 10
- #text = spaces
- other = 20
- #text = spacesJust discovered that node->nodeValue strips out all the tagsThis class apparently also has a getElementsByTagName method.
I was able to confirm this by evaluating the output from DOMNodeList->item() against various tests with the is_a() function.Yet another DOMNode to php array conversion function.
Other ones on this page are generating too "complex" arrays; this one should keep the array as tidy as possible.
Note: make sure to set LIBXML_NOBLANKS when calling DOMDocument::load, loadXML or loadHTML
See: http://be2.php.net/manual/en/libxml.constants.php
See: http://be2.php.net/manual/en/domdocument.loadxml.php
<?php
/**
* Returns an array representation of a DOMNode
* Note, make sure to use the LIBXML_NOBLANKS flag when loading XML into the DOMDocument
* @param DOMDocument $dom
* @param DOMNode $node
* @return array
*/
function nodeToArray( $dom, $node) {
if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
return false;
}
$array = false;
if( empty( trim( $node->localName ))) {// Discard empty nodes
return false;
}
if( XML_TEXT_NODE == $node->nodeType ) {
return $node->nodeValue;
}
foreach ($node->attributes as $attr) {
$array['@'.$attr->localName] = $attr->nodeValue;
}
foreach ($node->childNodes as $childNode) {
if ( 1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) {
$array[$childNode->localName] = $childNode->nodeValue;
} else {
if( false !== ($a = self::nodeToArray( $dom, $childNode))) {
$array[$childNode->localName] = $a;
}
}
}
return $array;
}
?>Here is a little function that truncates a DomNode to a specified number of text characters. I use it to generate HTML excerpts for my blog entries.
<?php
function makehtmlexcerpt(DomNode $html, $excerptlength)
{
$remove = 0;
$htmllength = strlen(html_entity_decode($html->textContent, ENT_QUOTES, 'UTF-8'));
$truncate = $htmllength - $excerptlength;
if($htmllength > $excerptlength)
{
if($html->hasChildNodes())
{
$children = $html->childNodes;
for($counter = 0; $counter < $children->length; $counter ++)
{
$child = $children->item($children->length - ($counter + 1));
$childlength = strlen(html_entity_decode($child->textContent, ENT_QUOTES, 'UTF-8'));
if($childlength <= $truncate)
{
$remove ++;
$truncate = $truncate - $childlength;
}
else
{
$child = makehtmlexcerpt($child, $childlength - $truncate);
break;
}
}
if($remove != 0)
{
for($counter = 0; $counter < $remove; $counter ++)
{
$html->removeChild($html->lastChild);
}
}
}
else
{
if($html->nodeName == '#text')
{
$html->nodeValue = substr(html_entity_decode($html->nodeValue, ENT_QUOTES, 'UTF-8'), 0, $htmllength - $truncate);
}
}
}
return $html;
}
?>And apparently also a setAttribute method too:
$node->setAttribute( 'attrName' , 'value' );It would be helpful if docs for concrete properties mentioned readonly status of some properties:
"
ownerDocument
The DOMDocument object associated with this node.
"A function that can set the inner HTML without encoding error. $html can be broken content such as "<a ID=id20>ssss"
function setInnerHTML($node, $html) {
removeChildren($node);
if (empty($html)) {
return;
}
$doc = $node->ownerDocument;
$htmlclip = new DOMDocument();
$htmlclip->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8"><div>' . $html . '</div>');
$clipNode = $doc->importNode($htmlclip->documentElement->lastChild->firstChild, true);
while ($item = $clipNode->firstChild) {
$node->appendChild($item);
}
}