我需要查询xml文档,然后显示特定的标记值,例如forename,surname,group(dept),job_title。
我正在使用XMLReader,因为我可能需要处理大型XML文件。我使用DomXPath过滤数据,但我不知道如何检索每个元素的nodeName和值。下面的代码只返回'member'作为节点名?
任何帮助都将不胜感激。
<?php
$reader = new XMLReader();
$reader->open('include/staff.xml');
while ($reader->read()){
switch($reader->nodeType){
case(XMLREADER::ELEMENT):
if($reader->localName === 'staff'){
$node = $reader->expand();
$dom = new DomDocument();
$dom->formatOutput = true;
$n = $dom->importNode($node, true);
$dom->appendChild($n);
$xp = new DomXpath($dom);
$res = $xp->query("/staff/member[groups='HR']");
}
}
}
echo $res->item(0)->nodeName;
echo $res->item(0)->nodeValue;
?>
答案 0 :(得分:1)
还是有点粗糙,但这就是我追求的目标。我发现我的xpath查询导致了问题。
<?php
$reader = new XMLReader();
$reader->open('include/staff.xml');
$keywords = '';
$query = "//member[groups='Research'][contains(translate(forename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz') ,'$keywords') or contains(translate(surname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'), '$keywords')]/*";
while ($reader->read()){
switch($reader->nodeType){
case(XMLREADER::ELEMENT):
if($reader->localName === 'staff'){
$node = $reader->expand();
$dom = new DomDocument();
$dom->formatOutput = true;
$n = $dom->importNode($node, true);
$dom->appendChild($n);
$xp = new DomXpath($dom);
$results = $xp->query($query);
}
}
}
$member = array();
$staff = array();
echo $results->length;
for($i=1; $i<$results->length; $i++){
if($results->item($i)->nodeName !== 'id'){
$member[$results->item($i)->nodeName] = $results->item($i)->nodeValue;
}else{
array_push($staff, $member);
}
}
array_push($staff, $member);
var_dump($staff);
&GT;
答案 1 :(得分:0)
尝试
$reader->name
和
$reader->value
根据此页http://www.php-editors.com/php_manual/ref.xmlreader.html
,它们应该是“节点的限定名称”和“节点的文本值”可以在这里找到更多使用示例:http://www.google.com/codesearch?q=xmlreader+file:.php $