【问题标题】:Accessing @attribute from SimpleXML从 SimpleXML 访问 @attribute
【发布时间】:2011-03-25 13:01:00
【问题描述】:

我在访问 SimpleXML 对象的 @attribute 部分时遇到问题。当我 var_dump 整个对象时,我得到正确的输出,当我 var_dump 对象的其余部分(嵌套标签)时,我得到正确的输出,但是当我按照文档和 var_dump @987654326 @,我得到一个空对象,尽管第一个 var_dump 清楚地表明有要输出的属性。

任何人都知道我在这里做错了什么/我怎样才能做到这一点?

【问题讨论】:

标签: php xml simplexml


【解决方案1】:

试试这个

$xml->attributes()->Token

【讨论】:

  • 已经回答by @Artefacto
  • 是的,这是最优雅的解决方案。
  • 我试过这个,我认为页面崩溃了。下面的 Bora 似乎认为这是一种错误的格式,我现在同意这一点。但是我已经多次看到这种(你的)格式。我是否缺少一些细微差别?
  • @GerardONeill,我不明白为什么 Bora 说这是访问属性的错误方式,它工作得非常完美。您可能缺少的是您需要在 XML 中与正确标记对应的对象上调用 attributes()。就像如果你有<root><tag attr="a">b</tag></root> 那么你需要做$xml->tag->attributes()->attr 来访问它。
  • 这对我来说返回 null,可能不是因为答案错误,而是因为答案缺乏足够的解释让我正确使用它。
【解决方案2】:

您可以通过在 XML 节点上调用 attributes() 函数来获取 XML 元素的属性。然后你可以 var_dump 函数的返回值。

更多信息在 php.net http://php.net/simplexmlelement.attributes

该页面的示例代码:

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}

【讨论】:

  • 有趣的是,$b 将是一个SimpleXMLElement 对象,所以print_rvar_dump 会给你一些奇怪的东西。您可以将其转换为字符串(或任何您喜欢的)来解决这个问题。
  • 执行 "".$b 以将其保留为字符串
【解决方案3】:

我之前用了很多次来获取@attributes,如下所示,它有点长。

$att = $xml->attributes();
echo $att['field'];

应该更简单,一次只能获取以下格式的属性:

标准方式 - 数组访问属性 (AAA)

$xml['field'];

其他选择是:

正确快速的格式

$xml->attributes()->{'field'};

格式错误

$xml->attributes()->field;
$xml->{"@attributes"}->field;
$xml->attributes('field');
$xml->attributes()['field'];
$xml->attributes->['field'];

【讨论】:

  • 我同意你的第一个错误格式,因为我遇到了页面崩溃——但是很多人都声称这是有效的。对此有何解释或细微差别?
  • “格式错误”有效。我总是使用第一个例子。为什么错了?
  • 技术上,$xml->attributes()->{'field'}$xml->attributes()->field$f='field'; $xml->attributes()->$f; 是相同的。看不出为什么一种格式正确而另一种格式错误。
  • $xml->attributes()->{'field'} 是正确的,因为在属性名称(即“data-attr”)中使用特殊字符是安全的。 $xml->attributes()->field 仅适用于单个字母数字单词的属性
  • 同时使用两个正确选项时获取 SimpleXMLElement。
【解决方案4】:
$xml = <<<XML
<root>
<elem attrib="value" />
</root>
XML;

$sxml = simplexml_load_string($xml);
$attrs = $sxml->elem->attributes();
echo $attrs["attrib"]; //or just $sxml->elem["attrib"]

使用SimpleXMLElement::attributes

事实是,SimpleXMLElement get_properties 处理程序很重要。没有名为“@attributes”的属性,所以你不能做$sxml-&gt;elem-&gt;{"@attributes"}["attrib"]

【讨论】:

  • 感谢您解释为什么 SimpleXML 以这种奇怪的方式表现(get_properties 处理程序)。很有趣。
  • 在执行此操作时获取 SimpleXMLElement 而不是 value
【解决方案5】:

你可以这样做:

echo $xml['token'];

【讨论】:

    【解决方案6】:

    如果您正在寻找这些属性的列表,XPath 将是您的朋友

    print_r($xml->xpath('@token'));
    

    【讨论】:

      【解决方案7】:

      它帮助我将 simplexml_load_file($file) 的结果转换为 JSON 结构并将其解码回来:

      $xml = simplexml_load_file("$token.xml");
      $json = json_encode($xml);
      $xml_fixed = json_decode($json);
      
      $try1 = $xml->structure->{"@attributes"}['value'];
      print_r($try1);
      
      >> result: SimpleXMLElement Object
      (
      )
      
      $try2 = $xml_fixed->structure->{"@attributes"}['value'];
      print_r($try2);
      
      >> result: stdClass Object
      (
          [key] => value
      )
      

      【讨论】:

        【解决方案8】:

        不幸的是,我有一个 PHP 5.5 的独特构建(暂时使用 Gentoo),而我发现的是

         $xml->tagName['attribute']
        

        是唯一有效的解决方案。我尝试了上面 Bora 的所有方法,包括“Right & Quick”格式,但都失败了。

        这是最简单的格式这一事实是一个优点,但我不喜欢认为我在尝试其他人所说的所有格式都发疯了。

        享受它的价值(我有没有提到独特的构建?)。

        【讨论】:

        • 我通常建议使用数组表示法来表示元素所在的同一命名空间中的属性的属性。我会说这是最简单的格式(因为你创造它)是有原因的。具有命名键 = 属性和 simplexml 元素的数组访问。
        猜你喜欢
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多