1

我有一个 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 文件的情况下转义冒号或稍后在文件中导航?

4

2 回答 2

4

如果我没记错的话,simplexml 开始定位于文档(顶部)元素,因此在这种情况下您无需担心 rdf:RDF。你试一试:

$xml->Status->presence

一般来说,访问具有特定命名空间的节点的方法似乎是使用 ->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>
于 2013-01-10T02:43:42.817 回答
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"
}
于 2013-01-10T13:09:28.030 回答