firstChild在XML DOM树中确定了奇怪的地方

时间:2017-01-25 00:34:47

标签: php xml dom

有人可以告诉我为什么下面第一行正在运行,而其他4行呢? 对于以下5行中的每一行......

1。)在右边----我写了发生的事情   2.)Underneathe - 我写了我预期会发生的事情。

PHP

$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

<?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

但这没有任何意义。

2 个答案:

答案 0 :(得分:0)

当我在<comments>之后但在第一个<post>之前输入“MMM”时,行/*2*//*3*/都会回显MMM而不是(和以前一样)没什么。显然,根节点的第一个孩子是它自己的文本内容。 (然后,nextSibling为我提供了根的第一个子元素,即<post>。)

答案 1 :(得分:0)

如您的回答所述,firstChild获取文本节点以及元素节点。

更具体地说,当给出解析器时:

<comments>
    <post>

... <comments>之后的换行符和<post>之前的四个空格导致解析器创建文本节点,并使该文本节点成为comments元素的第一个子节点。

因此,如果您正在使用DomDocument.load并且只想要元素节点,那么您需要:

  1. 使用DOMNode.childNodes并遍历由此返回的节点列表。
  2. 对于DOMNode.childNodes节点列表中的每个节点,使用DOMNode.nodeType检查type of each node
  3. 如果节点类型为XML_TEXT_NODE,请跳过它。如果是XML_ELEMENT_NODE,请做点什么。
  4. 或者,您可以使用SimpleXML,它可以提供更方便的API,例如:

    $comments = new SimpleXMLElement($str);
    echo $comments->post[0]->id;
    echo $comments->post[0]->author;