这是XML文件:
<?xml version="1.0" encoding="gb2312"?>
<Classes>
<Class>
<ClassID>1</ClassID>
<ClassName>建筑钢材</ClassName>
<ClassEnglishName>gangcai</ClassEnglishName>
<ParentID>0</ParentID>
</Class>
<Class>
<ClassID>2</ClassID>
<ClassName>特钢</ClassName>
<ClassEnglishName>tegang</ClassEnglishName>
<ParentID>0</ParentID>
</Class>
<Class>
<ClassID>3</ClassID>
<ClassName>螺纹钢</ClassName>
<ClassEnglishName>luowengang</ClassEnglishName>
<ParentID>1</ParentID>
</Class>
<Class>
<ClassID>4</ClassID>
<ClassName>型钢</ClassName>
<ClassEnglishName>xinggang</ClassEnglishName>
<ParentID>0</ParentID>
</Class>
</Classes>
这是PHP代码:
public function view($obj)
{
$doc = new DOMDocument();
$doc->load("database/class.xml");
$xpath  = new DOMXPath($doc);
$classes   =   $xpath-> evaluate( "/Classes/Class[ClassID='" . $obj->ClassID . "']");
//print_r($classes->item(0)-> nodeValue);
//$x = $classes->item(0)-> nodeValue;
//$arr = (array)$x;
//print_r($arr);
foreach(   $classes   as   $class   ) 
{
$obj->ClassName   =   $xpath-> evaluate( 'ClassName ',   $class)-> item(0)-> nodeValue;
$obj->ClassName = iconv ( "utf-8", "gb2312", $obj->ClassName );
$obj->ClassEnglishName   =   $xpath-> evaluate( 'ClassEnglishName ',   $class)-> item(0)-> nodeValue;
$obj->ParentID   =   $xpath-> evaluate( 'ParentID ',   $class)-> item(0)-> nodeValue;
}
return($obj);
}
相信您肯定会看到我用了foreach循环,是不是感到很奇怪?
因为我不知道怎么直接获取子节点的值,刚好网上有例子,所以就拿过来用了。
虽然说可以实现功能,但是这太不理想了。
注释部分是我试图想直接获取的代码,但是都不行。所以发上来,请大家帮我看下,万分感谢!

解决方案 »

  1.   

    $xml = simplexml_load_file('database/class.xml');   //创建 SimpleXML对象
    print_r($xml);         //输出 XML,就可以看到所有节点值了。
      

  2.   

    检查时用var_dump代替print_r你会发现问题所在不包含节点本身就用$textContent包含节点的就要用再用saveXML方法
    nodeValue获取到的是节点本身,类型是obj,不是字串,不能直接显示的,所以要再加一个saveXML转为字串代码不写了,你上面的改改就行另外,如果运行不畅的话,建议改用DOMXPath::query
    evaluate返回的类型是不定的,写xpath时要保持清晰的头脑
    query返回的是nodelist,不合要求的xpath会返回empty list,类型单一点,但容易查错