Использование xpath для возврата указанного c значения элемента на основе значения атрибута без цикла - PullRequest
0 голосов
/ 05 августа 2020

Мы интегрируемся с openrs, и они по-прежнему работают с xml, что ужасно: (

Вот возвращенный XML ответ:

<?xml version='1.0' encoding="UTF-8" standalone="no" ?>
<!DOCTYPE OPS_envelope SYSTEM "ops.dtd">
      <OPS_envelope>
           <header>
        <version>0.9</version>
        </header>
       <body>
        <data_block>
         <dt_assoc>
          <item key="action">REPLY</item>
          <item key="attributes">
           <dt_assoc>
            <item key="status">available</item>
           </dt_assoc>
          </item>
          <item key="is_success">1</item>
          <item key="response_text">Domain available</item>
          <item key="response_code">210</item>
          <item key="protocol">XCP</item>
          <item key="object">DOMAIN</item>
         </dt_assoc>
        </data_block>
       </body>
</OPS_envelope>

Я пытаюсь получить значение элемента:

<item key="response_code">210</item>

поэтому в этом примере пытаемся получить значение 210.

Используя xpath, я могу получить запрос пути , запустите al oop и получите значение следующим образом:

$xml = $r->xml;
$code = $xml->xpath('//item');
foreach($code AS $i) {
      if($i->attributes()->key == "response_code") {
            $code = $i;
      }
}
if(isset($code)) {
    // We got a code!
    echo  $code;
}
exit;

Это, однако, кажется очень неэффективным, и я просто не могу смириться с тем, что это лучший способ получить его. Я видел несколько хаков, в которых вы преобразовать xml с помощью json_decode (json_encode ($ xml)), который почти возвращает работоспособную строку json, но, поскольку есть ряд элементов, называемых item, я вынужден работать с массивом numeri c, который может не всегда представляйте правильное значение как правильный элемент массива.

Я застрял между камнем и наковальней или есть лучший способ получить значение?

EDIT

Кажется, я могу попробовать что-то вроде этого: * 102 2 *

$xml->xpath("//item[@key='response_code']")[0];

Однако вышеизложенное предполагает, что будет элемент с соответствующим атрибутом, называемым «response_code» - я мог бы сначала сделать «is_array» для значения, прежде чем предполагать, что значение установлено?

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Если ничего не найдено, вы получите пустой массив. Вы должны сделать что-то вроде этого:

$nlist = $xml->xpath("//item[@key='response_code']");

if(!empty($nlist)){
  echo (string)$nlist[0];
}
else {
  echo 'not found';
}

Выражение xpath теперь ищет только элементы «item» со специальным атрибутом. Это выражение ищет все элементы:

$nlist = $xml->xpath("//*[@key='response_code']");
0 голосов
/ 05 августа 2020

DOMXpath :: Assessment () может напрямую возвращать скалярные значения - и для этого требуется приведение типов в выражении Xpath:

$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMxpath($document);

var_dump(
  $xpath->evaluate('string(//item[@key="response_code"])')  
);

Вывод:

string(3) "210"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...