请参阅我的PHP:
file = "routingConfig.xml";
global $doc;
$doc = new DOMDocument();
$doc->load( $file );
function traverseXML($ElTag, $attr = null, $arrayNum = 'all'){
$tag = $doc->getElementsByTagName($ElTag);
$arr = array();
foreach($tag as $el){
$arr[] = $el->getAttribute($attr);
}
if ($arrayNum == 'all'){
return $arr;
}else if(is_int($arrayNum)){
return $arr[$arrayNum];
}else{
return "Invalid $arrayNum value: ". $arrayNum;
};
}
echo traverseXML("Route", "type", 2);
XML是:
<Routes>
<Route type="source"></Route>
<Route></Route>
<Routes>
返回的错误是:
Fatal error: Call to a member function getElementsByTagName() on a non-object
我不确定该怎么做?
编辑:以下是使用的实际代码。我最初剥离它试图让它更容易阅读,但我认为我的问题与使用该功能有关。
答案 0 :(得分:1)
您的函数中未定义$doc
变量。您有两种选择:
将$doc
作为函数参数之一传递,这是首选。
在函数顶部写global $doc;
...开发人员通常会尝试避免使用全局变量。
答案 1 :(得分:1)
你的问题是global $doc;
语句在之外的函数,因此变量$doc
未定义 in 函数。
这会解决它:
// ...
function traverseXML($ElTag, $attr = null, $arrayNum = 'all') {
global $doc;
// ...
... 但
全局变量是坏消息。它们通常表示设计不佳。
你真的应该将$doc
作为参数传递,如:
function traverseXML($doc, $ElTag, $attr = null, $arrayNum = 'all'){
$tag = $doc->getElementsByTagName($ElTag);
$arr = array();
foreach($tag as $el){
$arr[] = $el->getAttribute($attr);
}
if ($arrayNum == 'all'){
return $arr;
}else if(is_int($arrayNum)){
return $arr[$arrayNum];
}else{
return "Invalid $arrayNum value: ". $arrayNum;
};
}
$file = "routingConfig.xml";
$doc = new DOMDocument();
$doc->load( $file );
echo traverseXML($doc, "Route", "type", 2);
虽然你可能会考虑是否需要这个功能 - 如果你不在你的应用程序中的任何其他地方使用它,你也可以这样做:
$file = "routingConfig.xml";
$ElTag = "Route";
$attr = "type";
$arrayNum = 2;
$doc = new DOMDocument();
$doc->load( $file );
$tag = $doc->getElementsByTagName($ElTag);
$arr = array();
foreach($tag as $el){
$arr[] = $el->getAttribute($attr);
}
if ($arrayNum == 'all'){
echo $arr;
}else if(is_int($arrayNum)){
echo $arr[$arrayNum];
}else{
echo "Invalid $arrayNum value: ". $arrayNum;
};