选择一个PHP SimpleXML对象元素,该元素是一个数字

选择一个PHP SimpleXML对象元素,该元素是一个数字,php,simplexml,Php,Simplexml,我不确定如何选择“代码”元素-下面的脚本不起作用 $reply = SimpleXMLElement Object( [timing] => SimpleXMLElement Object( [code] => SimpleXMLElement Object( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [value] => q6h PRN

我不确定如何选择“代码”元素-下面的脚本不起作用

$reply = SimpleXMLElement Object(
 [timing] => SimpleXMLElement Object(
   [code] => SimpleXMLElement Object(
     [0] => SimpleXMLElement Object (
       [@attributes] => Array (
         [value] => q6h PRN
       )
     )
   )
 )
我尝试使用:
$timingCode=(字符串)$reply->timing->code['0']->attributes()->value

以及:
$timingCode=(字符串)$reply->timing->code{0'}->attributes()->value

原始XML如下:


我通过使用json\u解码然后json\u编码解决了这一问题,但我觉得它“有黑客味”,所以如果其他人可能建议更好的方法,请尝试一下

$get_timing_code = json_decode(json_encode($reply->timing->code), true);
$med_order_data['timingCode'] = $get_timing_code['0']['0']['@attributes']['value'];
另一个使用@Xorifelse answer修改的选项如下所示:

$med\u order\u data['timingCode']=(字符串)$reply->timing->code->text[0]->属性()->值

这同样有效:
$med_order_data['timingCode']=(字符串)$reply->timing->code->code->text['value']

使用XML解析器怎么样

$str = '<Bundle xmlns="http://hl7.org/fhir"><timing><code><text value="q6h PRN" /></code></timing></Bundle>';
$xml = simplexml_load_string($str);

foreach($xml->timing->code->text[0]->attributes() as $a => $b) {
  echo "my key is '$a' and the value is '$b'";
}

也就足够了。

如果XML是这样写的:

<Bundle xmlns="http://hl7.org/fhir">
    <timing>
        <code>
            <text value="q6h PRN" />
        </code>
    </timing>
</Bundle>
请注意,
code[0]
表示“第一个元素名为
”,因此您可以同样地编写:

$timingCode = (string) $reply->timing[0]->code[0]->text[0]->attributes()->value;
如果不提供数字,SimpleXML将假定第一个节点,因此即使有倍数,也可以写入:

$timingCode = (string) $reply->timing->code->text->attributes()->value;
更简单地说,如果不处理名称空间,通常不需要
->attributes()
方法,只需使用数组键语法访问属性,因此本例中最简单的形式实际上是:

$timingCode = (string) $reply->timing->code->text['value'];

您可以发布实际的XML吗?@user3783243添加在上面的
code
不是该示例中的数组<代码>$xml->计时->代码->文本['value']
就可以了。@user3783243-您的建议仍然返回对象
SimpleXMLElement对象([0]=>q6h PRN)
-但是它通过使用(string)@DropHit强制转换为字符串来工作,最有可能的是
var\u转储($simplexmlobject)
从类魔术方法
\uu debuginfo()
输出信息。如果试图
echo
一个类,将调用神奇的方法
\u tostring()
(如果存在)来返回一个简单字符串,所有这些都在SimpleXML内部处理。已经在使用SimpleXML\u load\u string:)将其放入SimpleXML对象中。您的代码仍然返回对象
simplexmlement对象([@attributes]=>Array([value]=>Daily))
,而不是值。但是,请参阅我的更新答案,其中包含您的建议,并稍加修改。是的,它将使用
var\u dump()
打印它是一个对象。但是,如果您回显该值,该对象将自动转换为字符串,生成所需的值;使用<代码> ->文本[值] <代码>和<代码> >文本[0 ] [值] <代码>,两个都将使用多个,但您可能会认为比另一个更可读。请不要使用JSON HACK,稍后您会后悔的。而
->code->code
将不适用于示例XML,因为
元素中没有额外的
元素。到目前为止,它们都可以工作(包括->code->code)但是,第二个选项是最好的IMHO。您的XML很接近,但与我的问题中的XML不完全相同。@DropHit我从您的问题中复制了它,并添加了空格以便于阅读(因为它对手头的任务没有影响)。如果它与实际的XML不匹配,那么您的问题就错了。
$timingCode = (string) $reply->timing->code->text->attributes()->value;
$timingCode = (string) $reply->timing->code->text['value'];