我有一个XML文件,我试图通过PHP获取变量。 XML文件如下所示:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dcq="http://purl.org/dc/terms/" xmlns="http://www.skype.com/go/skypeweb">
<Status rdf:about="urn:skype:skype.com:skypeweb/1.1">
您可以在此处查看完整的XML文件:http://mystatus.skype.com/username.xml
我使用simplexml扩展将xml输入转换为PHP对象$xml
。当我尝试稍后在文件中导航时使用:
$variable = $xml->rdf:RDF->Status->presence;
由于“rdf:RDF”中的冒号而导致错误:
解析错误:语法错误,意外':'
如何在不更改XML文件的情况下转义冒号,或稍后在文件中导航?
答案 0 :(得分:3)
如果我没弄错,simplexml会从文档(顶部)元素开始,因此在这种情况下你不需要担心rdf:RDF。试试吧:
$xml->Status->presence
通常,访问具有特定命名空间的节点的方式似乎是使用 - &gt; children(namespaceUri),如:
$xml->children('http://www.w3.org/2005/Atom')->entry->title
这样的事情:
<a:feed xmlns:a="http://www.w3.org/2005/Atom">
<a:entry>
<a:title>hello</a:title>
</a:entry>
</a:feed>
答案 1 :(得分:1)
您的初始代码:
$variable = $xml->rdf:RDF->Status->presence;
无效,因为它正在创建语法错误:
解析错误:语法错误,第8行/ test.php中的意外':'
属性名称中的冒号无效。 PHP使用它的常用方法是大括号:
$xml->{'rdf:RDF'}->Status->presence
当你发现你得到未定义的属性时,注意:
注意:尝试在第8行的/test.php中获取非对象的属性
这是第一手的,因为这样的属性不存在,var_dump
显示:
var_dump($xml);
class SimpleXMLElement#1 (1) {
public $Status =>
class SimpleXMLElement#2 (2) {
public $statusCode =>
string(1) "1"
public $presence =>
array(13) {
[0] =>
string(1) "1"
...
}
}
}
然而,除此之外,即使有一个带有名称空间前缀元素名称的子代,也不会那样。这只是从不工作,所以总是没有定义这样的属性。
然而,之前的转储大纲是 您正在寻找的属性:$Status
:
$variable = $xml->Status->presence;
所以你只是在找错了地方。 var_dump($variable)
是:
class SimpleXMLElement#4 (13) {
string(1) "1"
string(7) "Offline"
string(12) "Déconnecté"
string(7) "Offline"
string(15) "オフライン"
string(6) "離線"
string(6) "脱机"
string(7) "Offline"
string(7) "Offline"
string(12) "Non in linea"
string(12) "Desconectado"
string(15) "Niepodłączony"
string(7) "Offline"
}