使用 PHP XML Reader 获取上下文中的节点信息

Get Information of nodes in context with PHP XML Reader

@那些将此问题标记为重复的人,请留下您认为重复的原因的评论。在这里,我们想要获取某个节点中的所有元素。在另一个问题中,他们想要获得父节点。这几乎是相反的。在这里,我们没有选择人员节点及其子节点,而是让每个人都处于上下文中。我看它可能看起来很相似。

问题: 要清楚:我想用 XML Reader.

来做到这一点

我有一个 XML 文件,想检索上下文 people 中名称节点的内容。名称节点也出现在汽车中,这就是我需要上下文的原因。

我该怎么做?

<file>
  <people>
     <person>
        <name>father</name>
        <age>50</age>
     </person>
  </people>
  <car>
     <person>
        <name>mom</name>
        <age>45</age>
     </person>
     <name>Octavia</name>
     <brand>Scoda</brand>
  </car>
  <people>
     <person>
        <name>son</name>
        <age>25</age>
     </person>
     <person>
        <name>daughter</name>
        <age>20</age>
     </person>
  </people>

这是 PHP 目前我得到的:

$xmlReader = new XMLReader;

if (!$xmlReader->open($this->_file, null, 1<<19)) {
   die("Failed to open file");
}


while($xmlReader->read()) {
    // set the context
    if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'people') {
          // do something with the name of every person
          if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'person') {
              $xmlReader->name->readString();
          }
    }
}

这是代码:

$xmlReader = new XMLReader;

if (!$xmlReader->open($fileURL, null, 1<<19)) {
   die("Failed to open file");
}
while($xmlReader->read()) {
    if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'people') {
// We are at the beginning of the node people. 
        while ($xmlReader->read()) {
            if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'person') {
// We are at the beginning of the node person. 
                while ($xmlReader->read()) {
                    if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'name' && $xmlReader->read())
// And now node 'name. Then we make one read more to step to 'TEXT' type of node. Because 'ELEMENT' does not have value         
                        echo $xmlReader->value.'<br>';
                    else if ($xmlReader->nodeType == XMLReader::END_ELEMENT && $xmlReader->name == "person")
// This is closing element of node 'persons. Interrupt loop 
                        break;
                }
            }
            if ($xmlReader->nodeType == XMLReader::END_ELEMENT && $xmlReader->name == "people")
// This is closing element of node 'people. Interrupt loop 
                        break;
        }
    }
}

输出:

futher
son
daughter

更新: 或者将节点 'person' 放入 simplexml 对象。然后循环看起来像:

while($xmlReader->read()) {
    if ($xmlReader->nodeType == XMLReader::ELEMENT && $xmlReader->name == 'person') {           
        $xml = new SimpleXMLElement($xmlReader->readOuterXML());
        foreach ($xml->name as $name)
            echo $name.'<br>';
   }
}