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