【问题标题】:Getting the first XML element with SimpleXML使用 SimpleXML 获取第一个 XML 元素
【发布时间】:2013-04-12 10:56:43
【问题描述】:

好吧,这可能是个愚蠢的问题,但是我如何从 XML 文档中获取单个元素?

我有这个 XML

$element = $response['linkedin'];

SimpleXMLElement Object
( 
    [id] => 575677478478
    [first-name] => John
    [last-name] => Doe
    [email-address] => john@doe.com
    [picture-url] => http://m3.licdn.com/mpr/mprx/123
    [headline] => Headline goes here
    [industry] => Internet
    [num-connections] => 71

我只想将first-name 分配为$firstName

我可以使用 xPath 对其进行循环,但这似乎有点过头了。

例如:

$fName = $element->xpath('first-name');
foreach ($fName as $name) 
{
    $firstName = $name;
}

【问题讨论】:

  • 如果XMLElement 是您在$response['linkedin'] 中唯一使用的东西,$response[linkedin']->{'first-name'} = $name;应该可以为你做。
  • 谢谢@Jon,这就是我想要的!如果您将此添加为答案,我会接受。
  • 请同时利用现有的文档,其中显示了这一点以及更多内容:php.net/simplexml.examples-basic

标签: php xml xpath simplexml


【解决方案1】:

如果您将 SimpleXML 中的(一个或多个)元素节点列表作为单个元素访问,它将返回第一个元素。这是默认情况下(在SimpleXML Basic Usage 中也有概述):

$first = $element->{'first-name'};

如果有多个元素,您可以通过使用它的从零开始的索引来指定您所指的元素,无论是方括号(数组访问)还是花括号(属性访问):

$first = $element->{'first-name'}[0];
$first = $element->{'first-name'}{0};

这也允许您创建一个所谓的 SimpleXML 自引用来访问元素本身,例如删除它:

unset($first[0]);  # removes the element node from the document.

unset($first);     # unsets the variable $first

您可能会认为您的 Xpath 有点过头了。但在 SimpleXML 中并没有那么昂贵。有时访问元素的唯一方法是 with Xpath 甚至。因此,了解您也可以通过 xpath 轻松访问第一个元素可能对您很有用。例如 SimpleXML 中的父元素:

list($parent) $element->xpath('..'); # PHP < 5.4

$parent = $element->xpath('..')[0];  # PHP >= 5.4

正如您所见,真正了解事物的工作原理以更多地使用 SimpleXML 是值得的。如果您已经从 SimpleXML 基本用法 页面了解了所有内容,那么您可能想通过

了解更多信息

【讨论】:

  • "如果您将 SimpleXML 中的(一个或多个)元素节点列表作为单个元素访问,它将返回第一个元素" - 我对此感到困惑.如果我有一个有 2 个父母的 xml 字符串并且每个父母有 5 个孩子,为什么 $xml-&gt;parent-&gt;count() 返回 2 和 $xml-&gt;parent[0]-&gt;count() 返回 5? $xml->parent 和 $xml->parent[0] 似乎都指向同一个父元素。
  • 是的,回答您的问题令人困惑:即 b/c $xml-&gt;parent-&gt;count() 计算 $xml 元素的名为 parent 的子元素,而 @987654333 @ 计算 $xml 元素中第一个名为 parent 的子元素的所有子元素。 /// $xml-&gt;parent$xml-&gt;parent[0] 从不指向同一个对象 b/c 第一个是名为 parent 的子元素列表,第二个是名为 parent.
【解决方案2】:

每个请求的答复表单。 ^^

如果SimpleXMLElement$resource['linkedin'] 中包含的唯一一个,您可以使用以下命令进行更改:

$resource['linkedin']->{'first-name'} = $name;

这允许您直接访问该元素,而无需对其进行xpath。 ^^

【讨论】:

    【解决方案3】:

    您可以使用 XPath 查找匹配元素的第一个实例。

    /root/firstname[1] 将为您提供文档中 firstname 的第一个实例。

    $res=$response['linkedin']->xpath('/first-name[1]');
    

    【讨论】:

    • 仍然返回一个数组
    • 应该是一个只有一个元素的数组——只取第一个。
    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2021-05-16
    • 2021-04-26
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    相关资源
    最近更新 更多