在PHP中读取XML时如何逃避冒号,simplexml

时间:2013-01-10 01:47:33

标签: xml simplexml php

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

2 个答案:

答案 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"
}