有人可以告诉我为什么下面第一行正在运行,而其他4行呢? 对于以下5行中的每一行......
1。)在右边----我写了发生的事情 2.)Underneathe - 我写了我预期会发生的事情。
$doc = new DOMDocument();
$doc->load($str);
$doc->preserveWhiteSpace = true;
$doc->formatOutput = true;
/*1*/ echo $doc->firstChild->nodeValue; //WORKED - Echoed the whole DOC
//doc-> comments
/*2*/ echo $doc->firstChild->firstChild->nodeValue; //DIDNT WORK
//doc-> comments -> post
/*3*/ echo $doc->firstChild->firstChild->textContent; //DIDNT WORK
//doc-> comments -> post
/*4*/ echo $doc->firstChild->firstChild->nextSibling->nodeValue; //Echoed whole 1st <post>
//doc-> comments -> post -> 2nd post
/*5*/ echo $doc->firstChild->firstChild->nextSibling->firstChild->nodeValue; //Echoed 1st <post>'s <id>("1").
//doc-> comments -> post -> 2nd post -> id ("2")
<?xml version="1.0"?>
<comments>
<post>
<id>1</id><author>Demetrius</author>
</post>
<post>
<id>2</id><author>Demetrius</author>
</post>
</comments>
我能想出的唯一解释是,我已经抵消了错误&#39;以便 (在树的各个层面)......
2。)firstChild
实际上是<?xml version="1.0"?>
标记,
3。)firstChild
的功能为nextSibling
,然后是
4。)nextSibling
的功能为firstChild
。
但这没有任何意义。
答案 0 :(得分:0)
当我在<comments>
之后但在第一个<post>
之前输入“MMM”时,行/*2*/
和/*3*/
都会回显MMM
而不是(和以前一样)没什么。显然,根节点的第一个孩子是它自己的文本内容。 (然后,nextSibling
为我提供了根的第一个子元素,即<post>
。)
答案 1 :(得分:0)
如您的回答所述,firstChild
获取文本节点以及元素节点。
更具体地说,当给出解析器时:
<comments>
<post>
... <comments>
之后的换行符和<post>
之前的四个空格导致解析器创建文本节点,并使该文本节点成为comments
元素的第一个子节点。
因此,如果您正在使用DomDocument.load
并且只想要元素节点,那么您需要:
DOMNode.childNodes
并遍历由此返回的节点列表。DOMNode.childNodes
节点列表中的每个节点,使用DOMNode.nodeType检查type of each node。XML_TEXT_NODE
,请跳过它。如果是XML_ELEMENT_NODE
,请做点什么。或者,您可以使用SimpleXML,它可以提供更方便的API,例如:
$comments = new SimpleXMLElement($str);
echo $comments->post[0]->id;
echo $comments->post[0]->author;