Выбор элемента объекта PHP SimpleXML, который является числом - PullRequest
0 голосов
/ 04 июля 2018

Я не уверен, как выбрать элемент «код» - скрипт ниже не работает.

$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" />

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

А как насчет использования парсера 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.

Также будет достаточно.

0 голосов
/ 04 июля 2018

Если XML такой, как написано:

<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>", так что вы можете написать:

$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'];
0 голосов
/ 04 июля 2018

Я работал над этим, используя json_decode, а затем json_encode, однако мне это кажется "счастливым", поэтому, если другие могут предложить лучший подход - примите это.

$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'];

...