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

时间:2018-07-04 01:57:07

标签: php simplexml

我不确定如何选择“代码”元素-以下脚本无法正常工作。

$reply = SimpleXMLElement Object(
 [timing] => SimpleXMLElement Object(
   [code] => SimpleXMLElement Object(
     [0] => SimpleXMLElement Object (
       [@attributes] => Array (
         [value] => q6h PRN
       )
     )
   )
 )

我尝试使用: $timingCode = (string) $reply->timing->code['0']->attributes()->value;

以及: $timingCode = (string) $reply->timing->code{'0'}->attributes()->value;

下面的原始XML:

<Bundle xmlns="http://hl7.org/fhir"><timing><code><text value="q6h PRN" /></code></timing></Bundle>

3 个答案:

答案 0 :(得分:1)

仅使用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'";
}

但是由于它是一个奇异值:

echo $xml->timing->code->text[0]->attributes(); // echo the value of the first attribute of text, can be used in iteration.
echo $xml->timing->code->text['value'];         // This uses the first element found and gets the value attribute.
echo $xml->timing->code->text[0]['value'];      // This uses the first element found and make sure the first "text" element is used to get the value attribute from.

也足够了。

答案 1 :(得分:0)

我通过使用json_decode然后使用json_encode来解决此问题,但是对我来说,这是“ hacky”,因此,如果其他人可能会建议一种更好的方法,请尝试使用它。

$get_timing_code = json_decode(json_encode($reply->timing->code), true);
$med_order_data['timingCode'] = $get_timing_code['0']['0']['@attributes']['value'];

另一个使用@Xorifelse答案修改的选项如下:

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

这也可以:  $med_order_data['timingCode'] = (string) $reply->timing->code->code->text['value'];

答案 2 :(得分:0)

如果XML是书面形式:

return

然后您的第一次尝试已经结束,但是您缺少对<Bundle xmlns="http://hl7.org/fhir"> <timing> <code> <text value="q6h PRN" /> </code> </timing> </Bundle> 节点的引用,因此它必须为:

text

请注意,$timingCode = (string) $reply->timing->code[0]->text->attributes()->value; 的意思是“第一个称为code[0]的元素”,因此您可以这样写:

<code>

如果您不提供数字,SimpleXML将采用第一个节点,因此,即使有多个,您也可以编写:

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

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

->attributes()